我在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();
之前运行此代码,那么它可以正常工作,但之后没有。谁知道我做错了什么?如何实现这种动态变化的字体?
答案 0 :(得分:1)
由于UWP不支持DynamicResource
,这是一个非常严重的问题。 StaticResource
和ThemeResource
扩展名不会在此处保存,因为它们仅在评估时绑定,并且在基础资源更改时不会更新已评估的属性。
第一个选项是导航回来并再次导航到同一页面,以便重新加载控件并重新评估资源。
如果您想要更具活力的内容,请查看my answer on this SO question。如果您遵循该解决方案,则可以创建一个实现INotifyPropertyChanged
的类,该类将包含FontFamily
类型的属性,将此实例存储在StaticResource
中,然后使用绑定而不是StaticResource
像这样:
<TextBlock Text="{Binding Font, Source={StaticResource CustomUISettings}}" />