代码之家  ›  专栏  ›  技术社区  ›  user3239349

C#UWP动态更改全局字体

  •  2
  • user3239349  · 技术社区  · 6 年前

    我已在中创建了全局字体资源 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>
    

    在主页中,我添加了一个文本块:

    <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");
    

    但什么都没发生, 控件 仍使用旧字体。如果我以前运行过此代码 InitializeComponent(); 然后它就按我所希望的那样工作了,但在那之后,没有人知道我做错了什么?如何实现字体的这种动态变化?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Martin Zikmund    6 年前

    因为UWP不支持 DynamicResource 这是一个相当大的问题。这个 StaticResource ThemeResource 扩展不会将您保存在此处,因为它们仅在评估时绑定,并且在基础资源更改时不会更新已评估的属性。

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

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

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