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

时间:2018-01-15 20:03:46

标签: c# wpf xaml uwp

我有一个全局双资源,我用它来通过“StaticResource”扩展来设置字体大小。

<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中这样做的方法是什么?

1 个答案:

答案 0 :(得分:2)

您可以创建一个实现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();

现在使用数据绑定来绑定所需FontSize的{​​{1}}属性:

TextBlock

在应用设置中,您可以像这样修改值:

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

但请记住,这会带来性能损失,最好静态地执行此操作并要求用户重置应用程序。更好的是 - 让我们使用系统范围的字体大小设置,因为如果用户喜欢更大的字体,她可能会想要全面的。