我在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
,所以这是一个很大的问题。 StaticResource
和ThemeResource
扩展名不会将您保存在这里,因为它们仅在评估时绑定,并且在基础资源发生更改时不会针对已评估的属性进行更新。
第一种选择是向后导航并再次导航到同一页面,以便重新加载控件并重新评估资源。
如果您想获得更多动态效果,请查看my answer on this SO question。如果遵循该解决方案,则可以创建实现INotifyPropertyChanged
的类,该类将包含类型为FontFamily
的属性,将此实例存储在StaticResource
中,然后使用绑定代替StaticResource
,如下所示:
<TextBlock Text="{Binding Font, Source={StaticResource CustomUISettings}}" />