2012-04-23 170 views

回答

0

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

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

1

我目前正试图想出一个很好的设计。在发现缺少DynamicResources之前,我有一些相当“准备好”的东西。哎呀。

我想出最好的办法是让侦听更改设置VM并公开UI元素可以绑定到资源ThemedViewModel基地:

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"); 
      } 
     } 
    } 
} 

你会得到那么任何主题 - 基于虚拟机的虚拟机,任何主题化的UI元素都会绑定到暴露的资源。它相当干,但在我的脑海里真的打破了虚拟机的角色。 VM不应该有UI资源。它在虚拟机中的外观并不适合我。但是,主题受限于我的代码的View部分的每种方法似乎都会在绑定时遇到问题。

1

您并不总是需要动态资源。如下所示更改“静态”资源的值:

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

这并不总是适用于声明性内容。你在这些情况下可以做的是提供一个包装器对象;你不能取代包装,但你可以更新其属性。唉,有这种情况是不可行的。