我在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.Current.Resources["GlobalFont"] = new FontFamily("Arial");


但是没有任何反应,TextBlock仍使用旧字体。如果我在InitializeComponent();之前运行此代码,则它可以按我的要求运行,但之后不行。有人知道我做错了什么吗?如何实现字体的这种动态变化?

最佳答案

由于UWP不支持DynamicResource,所以这是一个很大的问题。 StaticResourceThemeResource扩展名不会将您保存在这里,因为它们仅在评估时绑定,并且在基础资源发生更改时不会针对已评估的属性进行更新。

第一种选择是向后导航并再次导航到同一页面,以便重新加载控件并重新评估资源。

如果您想获得更多动态效果,请查看my answer on this SO question。如果遵循该解决方案,则可以创建实现INotifyPropertyChanged的类,该类将包含类型为FontFamily的属性,将此实例存储在StaticResource中,然后使用绑定代替StaticResource,如下所示:

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

07-28 02:38
查看更多