如何在UWP中动态更改XAML资源的值

3

我有一个全局的double型资源,我通过“StaticResource”扩展来设置UI的字体大小。

<Application.Resources>
    <ResourceDictionary>
        <x:Double x:Key="MyFontSize">20</x:Double>
    </ResourceDictionary>
</Application.Resources>

然后我执行:

<TextBlock FontSize="{StaticResource MyFontSize}" Text="Something"><TextBlock>

但我希望这个设置是动态的,以便用户可以通过我的应用程序上的设置在运行时更改它,而无需重新启动它。我听说在WPF中曾经有“DynamicResource”扩展来解决这个问题。但是在UWP中不存在这个扩展。

那么在UWP中怎么做呢?


绑定到静态双精度属性?"{Binding Source="{x:Static local:MyUserSettings.FontSize}" - Milan
1个回答

4

您可以创建一个实现 INotifyPropertyChanged 接口并拥有您的 FontSize 属性的类:

public class UserSettings : INotifyPropertyChanged
{
   private double _fontSize = 20;
   public double FontSize
   {
       get { return _fontSize; }
       set { _fontSize = value; OnPropertyChanged(); }
   }

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

现在,在应用程序启动期间创建此类的一个实例,并将其存储为 Resource

Application.Current.Resources["UserSettings"] = new UserSettings();

现在,使用数据绑定来绑定所需 TextBlockFontSize 属性:

<TextBlock FontSize="{Binding FontSize, Source={StaticResource UserSettings}}"
           Text="Something" />

在应用程序设置中,您可以像这样修改值:
( ( UserSettings )Application.Current.Resources["UserSettings"] ).FontSize = newFontSize;

但请记住,这样做会带来性能损失,最好静态设置并要求用户重新启动应用程序。更好的做法是使用系统范围内的字体大小设置,因为如果用户喜欢更大的字体,她可能希望在整个应用中都使用更大的字体。

1
这让我真的希望WPF支持相对字体大小的概念,有点像HTML一样。以父对象的字体大小为基础,乘以“x”。我想这可以通过附加属性来模拟,但是第一类支持会很棒。 - Bradley Uffner
谢谢,我回家后会尝试这个。你说得对,应该尽可能使用系统范围内的字体大小。我在应用程序的大多数区域使用系统范围内的字体大小,并允许用户在应用程序的某些部分更改字体大小,因为该应用程序主要是阅读为基础的,我希望用户在进行长时间阅读时感到舒适。 - Canol Gökel
那肯定有道理。那就没问题了 :-) - Martin Zikmund

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接