天天看點

避免讓WPF資源字典變得雜亂臃腫

原文: 避免讓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範圍内。

避免讓WPF資源字典變得雜亂臃腫

但随着資源的增多,如果我們将這些資源都塞進一個XAML檔案中,那麼我們的XAML檔案将變得非常的臃腫(比如一不小心就幾千行,其閱讀性将變得很差,并且要想快速導航到欲查找的資源也不容易)。為此,我們得考慮如何重新組織我們的資源來解決這個問題。

一種可行的方式是将Resource按照類型來劃分到不同的ResourceDictionary檔案中,然後使用MergedDictionaries來合并各個資源字典。在進行分組之前所有的資源都在同一個資源字典中,如下圖:

避免讓WPF資源字典變得雜亂臃腫
我們按照不同的類型分組後(Brushes,DataTemplates,Styles,Converters等等,每一種類型對應一個資源字典,這樣資源字典就被拆分得比較小了),如下圖:
避免讓WPF資源字典變得雜亂臃腫
避免讓WPF資源字典變得雜亂臃腫

然後在将這些字典合并成一個字典來使用:

      <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會顯示各自的完整路徑來區分),如下圖:

避免讓WPF資源字典變得雜亂臃腫
避免讓WPF資源字典變得雜亂臃腫