【问题标题】:C# UWP dynamically change global fontC# UWP 动态更改全局字体
【发布时间】:2018-03-12 14:23:32
【问题描述】:

我在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(); 之前运行此代码,那么它可以按我的意愿工作,但在那之后就不行了。任何人都知道我做错了什么?如何实现这种字体的动态变化?

【问题讨论】:

    标签: c# fonts uwp resources


    【解决方案1】:

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

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

    如果您想要更动态的东西,请查看my answer on this SO question。如果您遵循该解决方案,您可以创建一个实现INotifyPropertyChanged 的类,该类将包含FontFamily 类型的属性,将此实例存储在StaticResource 中,然后使用绑定而不是StaticResource,如下所示:

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

    【讨论】:

    • 很高兴它有帮助:-)。编码愉快!
    猜你喜欢
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 2011-07-28
    • 2017-02-20
    相关资源
    最近更新 更多