C#UWP动态更改全局字体

时间:2018-03-12 14:23:33

标签: c# fonts uwp resources

我在App.xaml中创建了一个全局字体资源,如下所示:

<Application.Resources>
    <ResourceDictionary>
        <FontFamily x:Key="GlobalFontLight">Arial</FontFamily>
        <FontFamily x:Key="GlobalFont">Segoe UI</FontFamily>
        <FontFamily x:Key="GlobalFontBold">Caibri</FontFamily>
    </ResourceDictionary>
</Application.Resources>

在MainPage中我添加了一个TextBlock:

<TextBlock Text="Some text" FontFamily="{StaticResource GlobalFont}" Foreground="Black"/>
<TextBlock Text="Some text 2" FontFamily="{StaticResource GlobalFontLight}" Foreground="Black"/>
<TextBlock Text="Some text 3" FontFamily="{StaticResource GlobalFontBold}" Foreground="Black"/>

没关系,TextBlock使用我的全局字体。

现在,我想在Application Resources中更改该全局字体。我试过下一个代码:

Application.Current.Resources["GlobalFont"] = new FontFamily("Arial");

但没有任何反应,TextBlock仍然使用旧字体。如果我在InitializeComponent();之前运行此代码,那么它可以正常工作,但之后没有。谁知道我做错了什么?如何实现这种动态变化的字体?

1 个答案:

答案 0 :(得分:1)

由于UWP不支持DynamicResource,这是一个非常严重的问题。 StaticResourceThemeResource扩展名不会在此处保存,因为它们仅在评估时绑定,并且在基础资源更改时不会更新已评估的属性。

第一个选项是导航回来并再次导航到同一页面,以便重新加载控件并重新评估资源。

如果您想要更具活力的内容,请查看my answer on this SO question。如果您遵循该解决方案,则可以创建一个实现INotifyPropertyChanged的类,该类将包含FontFamily类型的属性,将此实例存储在StaticResource中,然后使用绑定而不是StaticResource像这样:

<TextBlock Text="{Binding Font, Source={StaticResource CustomUISettings}}" />