2

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

不过 WinRT 不支持 DynamicResource。

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

4

3 回答 3

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 部分的每种方法似乎在绑定时都会遇到问题。

于 2013-01-23T04:41:34.353 回答
1

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

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

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

于 2014-01-07T05:06:02.513 回答
0

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

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

于 2012-04-23T21:35:16.673 回答