2011-08-02 76 views
1

我該怎麼辦 - ?資源?載入主題(資源字典),但

  • 負載大ResourceDictionary與(或不)MergedDictionaries,但只添加未在其中找到資源(Application.Current.Resources)和更新發現這些密鑰。

我想這樣做,因爲我對我的wpf應用程序有很多主題,但是一些控件樣式是固定的。所以我首先清除所有資源,然後加載新的資源(一切都被清除)。有很多固定的樣式控件,所以我無法加載每個人的。

+0

不知道你的意思。找到並找不到哪裏?你究竟想要做什麼? –

+0

@AresAvatar更新 – Code0987

回答

2

Application.Resources是一個ResourceDictionary。你加載的字典也是一個ResourceDictionary。您可以通過添加將資源添加到ResourceDictionary。您可以枚舉ResourceDictionary中的資源,因爲它實現了ICollection。您還可以查詢資源是否存在,因爲它實現了IDictionary。 ResourceDictionary可以在其ResourceDictionaries集合中包含其他ResourceDictionaries:MergedDictionaries。

你想合併這些取決於一些事情。我使用的一種策略是在ResourceDictionary級別進行合併,因此我從Application.Resources.MergedDictionaries中刪除ResourceDictionary,然後添加我加載的ResourceDictionary。如果你想通過增加存在於您的ResourceDictionary單一的資源進行合併,但不Application.Resources存在,你可以列舉如下:

void AddOrUpdate(DictionaryEntry resource) 
{ 
    // If it exists, remove it; contains checks base and merged dictionaries 
    if (Application.Current.Resources.Contains(resource.Key)) 
    { 
     // Must try to remove from all; if it doesn't exist there is no effect 
     Application.Current.Resources.Remove(resource.Key); 
     foreach (ResourceDictionary nextDictionary in Application.Current.Resources.MergedDictionaries) 
      nextDictionary.Remove(resource.Key); 
    } 

    // We can now add it 
    Application.Current.Resources.Add(resource.Key, resource.Value); 
} 


void MergeMyDictionary(ResourceDictionary myResourceDictionary) 
{ 
    foreach (DictionaryEntry nextResource in myResourceDictionary) 
     AddOrUpdate(nextResource); 
    foreach (ResourceDictionary nextDictionary in myResourceDictionary.MergedDictionaries) 
    { 
     foreach (DictionaryEntry nextResource in nextDictionary) 
      AddOrUpdate(nextResource); 
    } 
} 
+0

它的工作原理。謝謝。我創建了一個控制變化的主題,懸而未決,並在3-4次點擊改變主題或從應用程序刪除焦點後工作。 ??? – Code0987

+0

偉大的,它的工作。我注意到 ??? (並且你沒有接受答案)。還有問題嗎? –

+0

是的。爲什麼應用程序在3-4次點擊改變主題或從應用程序中刪除焦點後掛起並工作。 ??? – Code0987