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

时间:2016-06-23 09:00:25

标签: c# mvvm fonts windows-phone-8.1 font-awesome

我的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图标。

Hub Section代码:

<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,它绑定到我对象的Icon属性。这应该会显示相应的FontAwesome图标,而只显示图标的unicode:

enter image description here

我尝试从视图中的代码中定义Hub控件的字体系列,但它没有效果:

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

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

2 个答案:

答案 0 :(得分:0)

你应该能够这样做:

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

并像这样设置FontFamily:

Hub.FontFamily = fontFam

答案 1 :(得分:0)

我通过解决方法解决了这个问题。我的ListView中的图标只能是5种可能的图标中的一种。因此,我没有设置unicode,而是在模板定义中创建了5个不同的文本框对象,每个图标对应一个。 unicode是静态的,因此动态方面是每个对象的可见性。我在自定义对象上创建了相应的XAML Visibility属性。在此之后,样式对象绑定到其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响应创建对象集合时,根据响应中的标记,将相应的visibility属性设置为Visible。

我想要一个比这更优雅的解决方案,但基本上它可以工作......