【问题标题】:How to dynamically change a XAML resource value for UWP如何动态更改 UWP 的 XAML 资源值
【发布时间】:2018-01-16 07:37:00
【问题描述】:

我有一个全局双资源,用于我的 UI 以通过“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 中的实现方式是什么?

【问题讨论】:

  • 绑定到静态双属性? "{Binding Source="{x:Static local:MyUserSettings.FontSize}"

标签: c# wpf xaml uwp


【解决方案1】:

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

现在使用数据绑定来绑定您想要的TextBlocks 的FontSize 属性:

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

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

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

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

【讨论】:

  • 这真的让我希望 WPF 支持相对字体大小的概念,有点像 HTML。取父对象的字体大小并乘以x。我想它可以用附加属性伪造,但一流的支持会很棒。
  • 谢谢,我回家后试试这个。你是对的,应该尽可能使用系统范围的字体大小。我在应用程序的大部分区域使用系统范围的字体大小,并允许用户更改应用程序某些部分的字体大小,因为该应用程序以阅读为基础,我希望用户能够舒适地进行长时间的阅读。
  • 这绝对是有道理的。那么这应该不是问题:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-24
  • 1970-01-01
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多