1. 程式人生 > >WPF-- 合併資源字典

WPF-- 合併資源字典

原文: WPF-- 合併資源字典

1.        合併多個外部資源字典成為本地字典

 

語言

XAML

示例程式碼

<Page.Resources>

  <ResourceDictionary>

    <ResourceDictionary.MergedDictionaries>

     

<ResourceDictionary Source="myresourcedictionary1.xaml"/>

      <ResourceDictionary Source="myresourcedictionary2.xaml"/>

    </ResourceDictionary.MergedDictionaries>

  </ResourceDictionary>

</Page.Resources>

 

描述

合併多個外部資源字典成為本地字典。當需要合併更多字典的時候只要在ResourceDictionary.MergedDictionaries節中順序增加引用。

特別提示

合併字典(MergedDictionaries 集合中的字典)中對同一物件的同一子元素進行定義的時候,會產生覆蓋效果:在這種情況下,所返回的資源將來自在 MergedDictionaries 集合中最後一個找到的字典。(在這裡會顯示myresourcedictionary2.xaml中的定義)。

合併字典(MergedDictionaries

集合中的字典)中對同一物件的不同子元素定義的時候會產生疊加效果。

 

2合併多個外部資源字典到本地字典

 

語言

XAML

示例程式碼

<Page.Resources>

  <ResourceDictionary>

    <ResourceDictionary.MergedDictionaries>

      <ResourceDictionary Source="myresourcedictionary1.xaml"/>

      <ResourceDictionary Source="myresourcedictionary2.xaml"/>

</ResourceDictionary.MergedDictionaries>

 

<!--A Style that affects all TextBlocks-->

        <Style TargetType="">

        </Style>

        

  </ResourceDictionary>

</Page.Resources>

 

描述

合併多個外部資源字典到本地字典。當需要合併更多字典的時候只要在ResourceDictionary.MergedDictionaries節中順序增加引用。

特別提示

合併字典(MergedDictionaries 集合中的字典)中對同一物件的同一子元素進行定義的時候,會產生覆蓋效果:在這種情況下,所返回的資源將來自在 MergedDictionaries 集合中最後一個找到的字典。(在這裡會顯示myresourcedictionary2.xaml中的定義)。

合併字典(MergedDictionaries 集合中的字典)中對同一物件的不同子元素定義的時候會產生疊加效果。

如果資源鍵在主字典以及合併字典(MergedDictionaries 集合中的字典)中均進行了定義,則所返回的資源將來自主字典。這些範圍規則對於靜態資源引用和動態資源引用同樣適用。

 

3.合併外部字典同時對外部字典進行擴充或替代

 

語言

XAML

示例程式碼

<Page.Resources>

  <ResourceDictionary>

    <ResourceDictionary.MergedDictionaries>

      <ResourceDictionary Source="myresourcedictionary1.xaml"/>

      <ResourceDictionary>

Source="myresourcedictionary2.xaml">

<!--A Style that affects all TextBlocks-->

        <Style TargetType="">

        </Style>

        

</ResourceDictionary>

</ResourceDictionary.MergedDictionaries>

 

  </ResourceDictionary>

</Page.Resources>

 

描述

合併外部字典同時對外部字典進行擴充或替代組合成本地字典。我們可以看到示例程式碼中紅色的部分就是對外部字典myresourcedictionary2.xaml的一個擴充或者替代( 注意,這不是常見的方案,合併字典的主要方案是合併來自外部檔案位置的資源。如果要在頁面的標記內指定資源,則通常應當在主 ResourceDictionary(而不是合併字典)中定義這些資源。).當需要合併更多字典只要在MergedDictionaries集合中順序增加引用。

特別提示

合併字典(MergedDictionaries 集合中的字典)中對同一物件的同一子元素進行定義的時候,會產生覆蓋效果:在這種情況下,所返回的資源將來自在 MergedDictionaries 集合中最後一個找到的字典。(在這裡會顯示myresourcedictionary2.xaml中的定義)。

合併字典(MergedDictionaries 集合中的字典)中對同一物件的不同子元素定義的時候會產生疊加效果。

如果資源鍵在主字典以及合併字典(MergedDictionaries 集合中的字典)中均進行了定義,則所返回的資源將來自主字典。這些範圍規則對於靜態資源引用和動態資源引用同樣適用。

 

 

4. 合併字典和程式碼

合併字典可以通過程式碼新增到 Resources 字典中。對於任何 Resources 屬性存在的預設 ResourceDictionary(初始為空)還有一個預設的 MergedDictionaries 集合屬性(初始為空)。若要通過程式碼新增合併字典,可以獲取對所需的主 ResourceDictionary 的引用,獲取它的 MergedDictionaries 屬性值,針對包含在 MergedDictionaries 中的泛型 Collection 呼叫 Add。您新增的物件必須是新的 ResourceDictionary。在程式碼中,不需要設定 Source 屬性,而必須通過建立或載入一個 ResourceDictionary 物件來獲取該物件。載入現有 ResourceDictionary 的一種方法就是,針對具有 ResourceDictionary 根的現有 XAML 檔案流呼叫 XamlReader..::.Load,然後將 XamlReader..::.Load 返回值強制轉換為 ResourceDictionary

 

不建議用這種方式合併外部字典,這使得外部資原始檔跟硬編碼偶合.

 

5. 合併資源字典 URI

可通過多種方法來包括合併資源字典,這些方法由將要使用的統一資源識別符號 (URI) 格式來指示。概括地說,這些方法可以分為兩類:作為專案一部分來編譯的資源;不作為專案一部分來編譯的資源。

對於作為專案一部分來編譯的資源,可以使用引用資源位置的相對路徑。相對路徑是在編譯過程中計算的。您的資源必須以資源生成操作形式定義為專案的一部分。如果您將資源的 .xaml 檔案以資源形式包括在專案中,則不必將資原始檔複製到輸出目錄,因為資源已經包括在所編譯的應用程式中。您還可以使用內容生成操作,但是您必須將檔案複製到輸出目錄,而且還必須將同一路徑關係中的資原始檔部署到可執行檔案中。

注意:

不要使用嵌入的資源生成操作。該生成操作本身受 WPF 應用程式的支援,但是在解析 Source 時不會合並 ResourceManager,因此無法將單獨的資源從流中分離出來。只要您在訪問資源時使用的還是 ResourceManager,您仍可以使用嵌入的資源來實現其他目的。

一個相關方法是使用 XAML 檔案的 Pack URI 並稱之為Pack URI 允許引用所引用程式集和其他方法的元件。有關 Pack URI 的更多資訊,請參見 Windows Presentation Foundation 應用程式資源、內容和資料檔案

對於不是作為專案一部分來編譯的資源,URI 是在執行時計算的。可以使用常見的 URI 傳輸機制(如 file: http:)來引用資原始檔。使用非編譯資源方法的缺點在於,file: 訪問機制需要額外的部署步驟,而 http: 訪問機制則直接使用 Internet 安全區域。

6.重用合併字典

可以在應用程式之間重用或共享合併資源字典,因為要合併的資源字典可以通過任何有效的統一資源識別符號 (URI) 來引用。您需要執行的確切操作將取決於應用程式的部署策略以及所遵循的應用程式模型。使用前面提到的 Pack URI 策略,在開發中可以通過共享程式集引用來將合併資源在多個專案之間共用。在該方案中,資源仍由客戶端分發,而且至少有一個應用程式必須部署所引用的程式集。還可以通過一個使用 http 協議的分散式 URI 來引用合併資源。

將合併字典編寫為本地應用程式檔案或本地共享儲存是另一種可能的合併字典/應用程式部署方案。