原文: 避免讓WPF資源字典變得雜亂臃腫
避免讓WPF資源字典變得雜亂臃腫
周銀輝
今天看到項目種的一個XXXResource.xaml檔案代碼有二千多行,這引發了我一些思考:如何組織我們的WPF資源。在WPF中可以有很多種組織資源的方式,下面分别介紹:
1,每個元素維持自己的資源。擁有Resources屬性的對象有很多種類型,比如Application、Window、Page、Style、FrameworkTemplate、FrameworkElement、FrameworkContentElement等。在這種模式種每種元素維持自己所需要的資源,而不顧忌資源是否可以共享,比如兩個Button:
<Button x:Name="btn1"
Content="button 1"
Foreground="{DynamicResource redBrush}">
<Button.Resources>
<SolidColorBrush x:Key="redBrush" Color="Red"/>
</Button.Resources>
</Button>
<Button x:Name="btn2"
Content="button 2"
Foreground="{DynamicResource redBrush}">
這造成的問題是,資源不能共享而重複建立一些相同的資源影響效率。
2,提高資源共享率。我們可以将共享的資源轉移更高的層次中,以便底層次的元素可以直接引用這些資源,而不必各自重新建立,比如:
<StackPanel>
<StackPanel.Resources>
<SolidColorBrush x:Key="redBrush" Color="Red"/>
</StackPanel.Resources>
</StackPanel>
我們将redBrush移動到了兩個Button的公共父親StackPanel中,這樣他們就可以同時引用了。
但通常情況下,為了更大範圍的共享,我們會将很多Resoureces移動到Window(或Page)甚至App範圍内。

但随着資源的增多,如果我們将這些資源都塞進一個XAML檔案中,那麼我們的XAML檔案将變得非常的臃腫(比如一不小心就幾千行,其閱讀性将變得很差,并且要想快速導航到欲查找的資源也不容易)。為此,我們得考慮如何重新組織我們的資源來解決這個問題。
一種可行的方式是将Resource按照類型來劃分到不同的ResourceDictionary檔案中,然後使用MergedDictionaries來合并各個資源字典。在進行分組之前所有的資源都在同一個資源字典中,如下圖:
然後在将這些字典合并成一個字典來使用:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Resources"Brushes.xaml"/>
<ResourceDictionary Source="Resources"Styles.xaml"/>
<ResourceDictionary Source="Resources"DataTemplates.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
這樣一個明顯的好處是,讓我們資源組織得更加的結構化,更好的查找和維護,更适合程式員的觀點。但其明顯的一個缺點是Blend的Resource目錄面闆對您多建立的資源的多級目錄結構表現得不明顯,不能展現目标的多層結構而展現成一個平面結構,導緻你不在區分不同檔案夾下的同名資源檔案時又些不友善(但,你可以把滑鼠移動到檔案上,其Tooltip會顯示各自的完整路徑來區分),如下圖: