【问题标题】:DynamicResource in Windows Store App apps?Windows 应用商店应用程序中的动态资源?
【发布时间】:2014-06-14 23:44:48
【问题描述】:

WPF 对 DynamicResource 的支持非常棒,因为这允许用户更改正在运行的应用程序的外观。

WinRT 不支持 DynamicResource。

编写允许用户动态更改 UI 主题的应用程序的推荐方法是什么?

【问题讨论】:

    标签: wpf windows-runtime windows-store-apps


    【解决方案1】:

    我目前也在尝试为此提出一个好的设计。在我发现缺少 DynamicResources 之前,我有一些相当“准备就绪”的东西。哎呀。

    我想出的最佳方法是拥有一个 ThemedViewModel 基础,用于侦听设置 VM 的更改并公开 UI 元素可以绑定到的资源:

    public class ThemedViewModel : ViewModelBase
    {
        public Brush Foreground { get { return ViewModelSelector.Settings.Theme.Foreground; } }
    
        public ThemedViewModel()
        {
            ViewModelSelector.Settings.PropertyChanged += (sender,arg) =>
            {
                if(arg.PropertyName == "Theme")
                {
                    RaisePropertyChanged("Foreground");
                }
            }
        }
    }
    

    然后,您可以从中派生任何基于主题的 VM,并且任何主题 UI 元素都将绑定到公开的资源。它相当干燥,但在我看来确实打破了虚拟机的意义。 VM 中不应包含 UI 资源。拥有它在 VM 中的外观并不适合我。但是,将主题限制在代码的 View 部分的每种方法似乎在绑定时都会遇到问题。

    【讨论】:

      【解决方案2】:

      您并不总是需要动态资源。像这样更改“静态”资源的值:

      Resources.Remove("foo");
      Resources.Add("foo", "A new hope");
      

      这并不总是适用于声明性的东西。在这些情况下,您可以做的是提供一个包装器对象;您无法替换包装器,但您可以更新其属性。唉,在某些情况下这是不可行的。

      【讨论】:

        【解决方案3】:

        如果您使用 MVVM 模式,那么基于切换的主题重新创建视图应该相当容易,而无需重新创建基础数据 - 取决于您将视图和视图模型结合的方式。

        只需拥有多个主题资源字典并切换您将其中的哪些与您的应用程序资源字典合并,然后重新创建视图。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多