无法在运行时显示自定义字体 - Windows Phone 8.1 MVVM - FontAwesome

Can't get custom fonts to display at runtime - Windows Phone 8.1 MVVM - FontAwesome

我在 Windows Phone 8.1 MVVM 应用程序中遇到自定义字体问题。

我正在使用 FontAwesome 图标。我在我的项目中包含了 FontAwesome 字体文件。当我设置这样的静态控件时,它工作得很好;

<TextBlock x:Name="txtTest" Grid.Row="3" Text="&#xf236;" Foreground="Black" FontSize="20" FontFamily="/Assets/Fonts/FontAwesome.ttf#FontAwesome"/>

但是,我需要的是让它动态工作。我在应用程序的主页上有一个 Hub 控件,每个 Hub 部分都有 ListViews。这些绑定到自定义对象的集合,从 API 响应中填充。创建对象集合时,代码会在响应中查找标记并根据标记动态设置 FontAwesome 图标。

集线器部分代码:

<HubSection x:Uid="hubApproved" Header="Approved"
                    DataContext="{Binding MyObjects.Approved}" 
                    d:DataContext="{Binding MyObjects.Approved}"
                    HeaderTemplate="{ThemeResource HubSectionHeaderTemplate}" >
            <DataTemplate>
                <ListView
                    ItemsSource="{Binding}"                                                   
                    ItemTemplate="{ThemeResource ApprovedTemplate}"                        
                    IsItemClickEnabled="True"
                    ItemClick="ListView_ItemClick"
                    ContinuumNavigationTransitionInfo.ExitElementContainer="True">
                </ListView>
            </DataTemplate>
        </HubSection>

这是绑定到此的批准模板:

<DataTemplate x:Key="ApprovedTemplate">
    <StackPanel Margin="0,0,0,19" Background="{x:Null}" >
        <TextBlock FontFamily="/Assets/Fonts/FontAwesome.ttf#FontAwesome" Text="{Binding Icon}" Foreground="Black" />
        <TextBlock Text="{Binding SupplierName}" Style="{ThemeResource ListViewItemTripNameTextBlockStyle}" />            
        <TextBlock Style="{ThemeResource ListViewItemSubheaderTextBlockStyle}" Text="{Binding StartDate}"></TextBlock>
    </StackPanel>
</DataTemplate>

模板包含绑定到我的对象的图标 属性 的 TextBlock。这应该会显示适当的 FontAwesome 图标,但只是显示图标的 unicode:

我试过在视图后面的代码中定义Hub控件的字体系列,但是没有效果:

Hub.FontFamily = new FontFamily("ms-appx:///Assets/Fonts/FontAwesome.otf#FontAwesome");

关于如何动态显示这些图标的任何想法...?谢谢

你应该可以这样做:

FontFamily fontFam = new FontFamily("ms-appx:///Assets/Fonts/FontAwesome.otf#FontAwesome");

并像这样设置 FontFamily:

Hub.FontFamily = fontFam

我用变通方法解决了这个问题。我的 ListView 中的图标只会是 5 个可能图标中的 1 个。因此,我没有设置 unicode,而是在模板定义中创建了 5 个不同的文本框对象,每个图标一个。 unicode 是静态的,因此动态方面是每个对象的可见性。我在自定义对象上创建了相应的 XAML 可见性属性。在此之后,样式对象绑定到它的 Visibility 属性,像这样:

<!--Generic (shopping cart icon)-->
<TextBlock FontFamily="/Assets/Fonts/FontAwesome.otf#FontAwesome" Grid.Column="0" Text="&#xf07a;" Style="{ThemeResource ListViewItemTripNameTextBlockStyle}" 
                   VerticalAlignment="Center" Visibility="{Binding VisGeneric}" />

然后,当我从 API 响应创建对象集合时,根据响应中的标记,我将适当的可见性 属性 设置为可见。

我想要一个比这更优雅的解决方案,但基本上它是有效的...