2012-04-23 172 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"); 

這並不總是適用於聲明性內容。你在這些情況下可以做的是提供一個包裝器對象;你不能取代包裝,但你可以更新其屬性。唉,有這種情況是不可行的。