ResourceDictionary 和 XAML 資源引用


XAML 定義應用的 UI,並且 XAML 也可以定義 XAML 中的資源。資源通常是對你希望多次使用的某些對象的定義。你要為 XAML 資源定義一個鍵,以供將來引用,該鍵的作用類似於資源的名稱。你可以在整個應用中或從應用中的任意 XAML 頁面引用資源。Windows 運行時 XAML 具有一個 ResourceDictionary 元素,你可以在其中定義你的資源。然后可使用 StaticResource 標記擴展或 ThemeResource 標記擴展來引用你的資源。

你最希望聲明為 XAML 資源的 XAML 元素包括 StyleControlTemplate、動畫組件和 Brush 子類。我們在此處介紹了如何定義一個 ResourceDictionary 和鍵控資源,以及 XAML 資源與你在應用或應用包中定義的其他資源之間的關系。我們還介紹了資源字典高級功能,例如 MergedDictionaries 和 ThemeDictionaries

先決條件

我們假設你理解 XAML 標記並已閱讀 XAML 概述

XAML 資源必須可共享

對於存在於 ResourceDictionary 中的對象,該對象必須“可共享”。

可共享是必要的,因為在構造以及在運行時使用應用的對象樹時,對象不能存在於樹中的多個位置。就內部而言,在請求所有 XAML 資源時,資源系統會為在資源的對象圖中使用的資源值創建副本。

通常,ResourceDictionary 和 Windows 運行時 XAML 支持將下列對象用於共享:

此外,如果遵循必要的實現模式,則可將自定義類型用作可共享資源。在支持代碼(或所含運行時組件)中定義這些類,然后在 XAML 中將其實例化為資源。示例包括對象數據源和用於數據綁定的 IValueConverter 實現。

自定義類型必須包含默認構造函數,因為 XAML 分析程序須借助該構造函數對類進行實例化。用作資源的自定義類型不能包含其繼承中的 UIElement 類,因為 UIElement 無法共享(而只能用於表示運行時應用的對象圖中某一位置的一個 UI 元素)。

資源的鍵

必須為 ResourceDictionary 內的每項定義一個鍵。從編程意義上講,ResourceDictionary 實際上是一個字典。通常可使用 x:Key 特性為 XAML 資源定義鍵。 可以作為 XAML 資源的對象有很多種,而這些對象不共享任何共用 Windows 運行時屬性。因此,若要將可能存在的多種資源放到一個資源字典中,應通過 XAML 語言對 x:Key 特性進行全局定義,該特性可以合法地應用於字典中的任何 XAML 對象元素。

x:Key 成為字典項的鍵,而 XAML 中的其他值所定義的對象則作為該項的值。

Windows 運行時 XAML 的資源必須使用字符串作為其鍵名稱。具體而言,該字符串必須遵循 XamlName 語法的規則。如需有關信息,請參見“x:Key 特性”參考頁面上的“XamlName 語法”一節。

如果將一項包含在 ResourceDictionary 中,並且該項沒有一個適用的鍵,在應用嘗試查找資源項時將發生一個 XAML 分析錯誤。如果復制一個鍵,則會導致分析錯誤。如果 XAML 中有資源定義或資源引用問題,Microsoft Visual Studio 和它的 XAML 設計界面常常能提供設計時反饋。但是,如果 XAML 設計人員不能提供警告,應用在運行時嘗試加載 XAML 時,XAML 資源定義問題可能報告為錯誤或異常。

控件模板和樣式的隱式鍵

控件模板和帶 TargetType 屬性的 Style 元素均屬於特殊情況,因為它以 XAML 資源的形式存在時不需要 x:Key 特性值。對於這些類型而言,資源的鍵為隱式鍵。該隱式鍵的值基於在模板或樣式中聲明的字符串形式的 TargetType 值,並且在運行時 XAML 控件邏輯將使用該鍵,用於隱式查找應用於特殊控件的樣式或模板。例如,包含TargetType="Button" 的 Style 可以是應用中所有 Button 控件的隱式樣式,它在資源的定義中或來自每個 Button 的StaticResource 引用中無需使用鍵。有關隱式樣式及其工作方式的詳細信息,請參閱快速入門:控件模板

情節提要資源

Storyboard 資源是另一種特殊情況,其中 Storyboard 可以在不具有 x:Key 值的情況下存在於的ResourceDictionary 中,但前提是它具有 x:Name 值。將 Storyboard 放置在 ResourceDictionary 中的操作通常不可重用,因為其中的動畫已指向特定屬性。但是,ResourceDictionary 僅僅是一個便捷 XAML 容器,可用於在其中放置各種 Storyboard 元素。最終,你將按名稱引用 Storyboard 實例,並調用其 Begin 方法。通常通過代碼隱藏完成此操作以響應 Loaded 等事件,或綁定到用戶啟動的事件。有關詳細信息,請參閱情節提要動畫

直接和應用資源

對於包含 ResourceDictionary 節點並可在其中定義 XAML 資源的典型應用,其包含以下兩種屬性:FrameworkElement.Resources 和 Application.Resources

FrameworkElement.Resources 提供直接資源。直接資源有時也稱為頁面資源。在 XAML 中,你可以使用直接引用技術,從連接到相同對象樹的任何對象的 FrameworkElement.Resources 中引用 XAML 資源。這基本上意味着從相同的 XAML 頁面引用,因為通常都是在 XAML 頁面的根元素上定義 FrameworkElement.Resources 值,在這里頁面內可能存在的所有 XAML 元素都可以找到它。

Application.Resources 提供應用級資源。無論加載哪個頁面或其他 UI 作為應用當前的Window.ContentApplication.Resources 定義的資源都可用。如果將不同頁面加載到 Window.Content 中以支持導航,並且希望避免在每個頁面中復制相同的資源,則在應用級指定資源會很有用。另外,如果為使稍后加載的頁面能找到 ResourceDictionary 而在運行時向其添加鍵/值對(資源),則應用范圍會提供一個位置,以供在應用的生存期中持久保存這些資源。

可能存在資源的第三個位置是在控件的默認樣式中,它與控件一起封裝。此位置僅用於查找使用控件的DefaultStyleKey 值作為鍵的資源。

注意   不要將 ResourceDictionary 相關的概念與“資源”構建操作、資源 (.resw) 文件或在創建生成應用包的代碼項目上下文中探討的其他“資源”相混淆。有關應用資源概念的詳細信息,請參閱定義應用資源如何為本地化做准備

從 XAML 引用資源

在 XAML 中,你可以使用 StaticResource 標記擴展或 ThemeResource 標記擴展從 ResourceDictionary 引用現有 XAML 資源。在本文檔中,這些統稱為 XAML 資源引用。要通過標記擴展使用 XAML 資源引用,你必須始終使用屬性語法引用你設置的屬性。

以下是一些示例 XAML。若要設置 Button 的 Background 屬性值以使用名為 fadeBrush 的靜態資源,你必須先使用鍵聲明資源,然后才能按鍵引用該資源。

<ResourceDictionary>
...
  <LinearGradientBrush x:Key="fadeBrush">
    <GradientStop Color="Red" Offset="0"/>
    <GradientStop Color="Gray" Offset="1"/>
  </LinearGradientBrush>
</ResourceDictionary>
...
 <!--XAML within a UserControl or some other root container tag that defines app UI-->
<Button Background="{StaticResource fadeBrush}" .../>

在前面的示例中,兩部分 XAML 可能甚至未在同一個 XAML 文件中。ResourceDictionary 可在Application.Resources 中的主題字典文件或合並字典文件中定義。

你可使用 XAML 屬性語法來執行 XAML 資源引用,即使你設置的屬性通常需要在 XAML 中使用屬性元素也是如此。例如,這是一種等效的屬性元素用法,該用法顯示了以內聯方式而非作為 ResourceDictionary 資源定義的LinearGradientBrush

<Button>
  <Button.Background>
    <LinearGradientBrush>
      <GradientStop Color="Red" Offset="0"/>
      <GradientStop Color="Gray" Offset="1"/>
    </LinearGradientBrush>
  </Button.Background>
</Button>

針對 XAML 資源引用的查找行為

查找行為這一術語用於表示 XAML 資源系統如何嘗試查找 XAML 資源。此查找適用於在應用 XAML 的某處被引用為 XAML 資源引用的鍵。資源系統具有可預測行為,它將為此類行為根據作用域檢查是否存在資源。如果在初始作用域中未找到資源,該作用域將展開。將在應用或系統可能定義了 XAML 資源的位置和作用域上繼續查找行為。如果所有可能的資源查找嘗試均失敗,通常會導致錯誤。通常可以在開發過程中消除這些錯誤。

針對 XAML 資源引用的查找行為首先從實際應用引用的對象以及它自己的 Resources 屬性開始。如果存在一個ResourceDictionary,則會檢查該 ResourceDictionary 以查看其中是否存在具有所請求鍵的項。該第一級查找很少包含相關信息,因為你通常不會在同一個對象上定義某個資源然后引用該資源。 實際上,Resources 屬性通常不存在。你幾乎可以在 XAML 中的任何位置進行 XAML 資源引用,而是僅限於在 FrameworkElement 子類的屬性中。

查找序列然后檢查應用的運行時對象樹中的下一個父對象。如果存在一個 FrameworkElement.Resources 並且它持有一個 ResourceDictionary,將請求具有指定鍵字符串的字典項。如果找到資源,查找序列就會停止,並將該對象提供到執行引用的位置。否則,查找行為會向對象樹根方向前進到下一個父級對象。此查找會繼續遞歸前進,直至到達 XAML 的根元素,從而完成對所有可能直接資源位置的搜索。

注意  一種常見的做法是在頁面的根級別定義所有直接資源,以利用該資源查找行為並將其用作 XAML 標記樣式的一個慣例。

如果未在直接資源中找到所請求的資源,下一個查找步驟是檢查 Application.Resources 屬性。Application.Resources 是放置被應用導航結構中多個頁面引用的任何應用特定資源的最佳位置。

在引用查找中,控件模板有另一個可能的位置:主題字典。主題字典是單個 XAML 文件,它使用一個ResourceDictionary 元素作為其根。主題字典可能是來自 Application.Resources 的一個合並字典。主題字典也可能是一個特定於控件的主題字典,用於模板化的自定義控件。

最后,還有一種針對平台資源的資源查找。平台資源包括為每個系統 UI 主題定義的控件模板,以及用於定義你在 Windows 運行時應用中為所有 UI 控件使用的默認外觀的控件模板。平台資源還包括與系統范圍內的外觀和主題相關的一組已命名資源。從技術上來說,這些資源是 MergedDictionaries 項,因此在加載應用之后可用於從 XAML 或代碼中查找。例如,系統主題資源包括一個名為 "SystemColorWindowTextColor" 的資源,該資源提供一個 Color 定義以使應用文本顏色與系統窗口的文本顏色(來自操作系統和用戶首選項)相匹配。應用的其他 XAML 樣式可以引用該樣式,或者你的代碼可以獲取資源查找值(並將該值強制轉換為示例中的 Color)。

有關可用於使用 XAML 的 Windows 應用商店應用的特定於主題和系統資源的詳細信息和列表,請參閱 XAML 主題資源引用

如果請求的鍵仍未在這其中任何位置中找到,會發生 XAML 分析錯誤/異常。某些情況下,XAML 分析異常可能是 XAML 標記編譯操作或 XAML 設計環境未檢測到的運行時異常。

根據針對資源字典的分層查找行為,你可特意定義多個資源項,每個資源項使用相同的字符串值作為鍵,只要將每個資源定義在不同的級別上即可。換言之,盡管鍵在任何給定的 ResourceDictionary 中必須是唯一的,但該唯一性要求不會擴展到整個查找行為序列。在查找過程中,只有成功檢索到的首個此類對象會用於 XAML 資源引用,隨即查找便會停止。你可以利用此行為在應用 XAML 內的各個位置通過鍵請求相同的 XAML 資源,但會取回不同的資源,具體取決於進行 XAML 資源引用的范圍以及特殊查找的行為方式。

合並的資源字典

合並的資源字典使你能夠引用一個外部文件來聲明資源字典的內容,使用外部定義的資源來補充在 Resources 屬性中找到的資源。合並的資源字典的使用修改了資源字典的兩個特征:查找序列和一個范圍內的鍵唯一性需求。

要聲明合並的資源字典,可以向一個現有 ResourceDictionary 元素的 MergedDictionaries 屬性添加一個屬性元素。你可以為 FrameworkElement.Resources 或 Application.Resources 屬性添加MergedDictionaries(但合並到Application.Resources 中是更典型的做法)。

你必須顯式地將 ResourceDictionary 聲明為一個對象元素,從而在它的內部使用ResourceDictionary.MergedDictionary 屬性元素。除了 MergedDictionaries 屬性元素,現有的ResourceDictionary 還可有其他鍵控資源。MergedDictionaries XAML 屬性元素的內容包括一個或多個聲明為 XAML 對象元素的 ResourceDictionary 項。表示合並字典的 ResourceDictionary 元素不能使用其他鍵控資源作為內容。相反,這些 ResourceDictionary 元素必須僅聲明一個特性:SourceSource 值是引用資源字典的外部位置的方式。

例如,以下 XAML 定義了一個包含鍵控資源的 ResourceDictionary,以及一個引用了兩個不同資源字典 XAML 文件的MergedDictionaries 集合。

<Application.Resources>
    <ResourceDictionary>
      <!--other resources can be here-->
      <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="rd1.xaml" />
        <ResourceDictionary Source="rd2.xaml" />
      </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
  </Application.Resources>

可以在 MergedDictionaries 中指定多個 ResourceDictionary。 在資源查找序列中,僅在檢查聲明ResourceDictionary 的所有鍵控資源后,才會檢查 MergedDictionaries 字典。此后,搜索該級別時會深入到合並后的字典,且對 MergedDictionaries 中的每一項進行檢查。如果存在多個合並的字典,會按在 MergedDictionaries 屬性中聲明這些字典的順序的相反順序來檢查它們。在上一示例中,如果 "rd2.xaml" 和 "rd1.xaml" 均聲明同一個鍵,則會首先使用來自 "rd2.xaml" 的鍵,因為它排在 MergedDictionaries 的末尾。

在任一 ResourceDictionary 范圍內,均會檢查字典中鍵的唯一性。但是,這一范圍不會擴展到不同MergedDictionaries 文件中的不同項。

可以結合使用查找序列和跨合並字典范圍不強制使用唯一鍵來創建 ResourceDictionary 資源的回退值序列。例如,你可能會使用與應用的狀態數據和用戶首選項數據同步的資源詞典,為序列中最后合並的資源字典中的特殊筆刷顏色保存用戶首選項。但是,如果尚不存在任何用戶首選項,則可為初始 MergedDictionaries 文件中的 ResourceDictionary 資源定義相同的鍵字符串,並可將其用作回退值。 請記住,始終會在檢查合並字典之前檢查你在主要資源字典中提供的任何值,所以如果希望使用回退技術,請勿在主要資源字典中定義該資源。

主題字典

主題字典是一種特殊類型的合並字典,用於保存各種資源,具體資源取決於用戶當前在其電腦上使用的主題。例如,“淺色”主題可能使用白色畫筆,而默認主題可能使用黑色畫筆。畫筆會更改其所溶入的資源,但使用該畫筆作為資源的控件的組成則可能保持不變。若要在個人模板或樣式中重現主題切換行為而不將 MergedDictionaries 用作屬性以將項目合並到主詞典中,則應使 ThemeDictionaries 屬性。與 MergedDictionaries 一樣,請使用屬性元素語法設置此屬性,並且屬性的值是一個或多個 ResourceDictionary 對象元素。

ThemeDictionaries 內的每個 ResourceDictionary 元素必須具有一個 x:Key 值。該值是一個字符串,它指定相關主題的名稱,—例如,"Default"、"Light" 或 "HighContrast"。

包含的 ResourceDictionary 元素可使用兩種可能的模型之一:

  • ResourceDictionary 只有一個特性 Source,沒有其他內容。Source 引用一個獨立的 XAML 文件,該文件僅包含一個 ResourceDictionary 根。此字典然后定義特定於主題的鍵控項,該主題由指定 Source 的 ResourceDictionary 元素上的 x:Key 值命名。Source 值通常引用項目結構和應用包中的一個 XAML 文件。
  • ResourceDictionary 包含內容,這些內容是特定於主題的鍵控項,該主題由父 ResourceDictionary 元素上的x:Key 值命名。

與合並的字典類似,在同一 ThemeDictionaries 集合中的一組主題字典中多次定義同一個鍵是合法的,只要該鍵在每個ResourceDictionary 單元中是唯一的。事實上,這是一種特意的設計:每個主題字典應該有一組相同的鍵。否則,任何缺少某個鍵的主題都可能在加載該主題時導致 UI 問題。與合並的字典不同的是,每個主題的定義的順序無關緊要。對於主題字典,每當使用 ThemeResource 標記擴展進行引用並且系統檢測到主題更改時,要用於資源查找的活動字典都會動態更改。系統查找行為以將活動主題映射到特定主題字典的 x:Key 為基礎而執行。

檢查主題字典在默認 XAML 設計資源中的構建方式十分有用,這些資源與 Windows 運行時默認用作其控件的模板相對應。在 IDE 中使用文本編輯器或類似編輯器以打開 \(Program Files)\Windows Kits\<version>\Include\winrt\xaml\design 中的 XAML 文件。請注意主題字典首先在 generic.xaml 中的定義方式,以及每個主題字典定義相同鍵的方式。然后每個這樣的鍵由構成各種鍵控元素的元素所引用,這些鍵控元素位於主題字典外部並且稍后在 XAML 中定義。還存在用於設計的單獨 themeresources.xaml 文件,該文件僅包含主題資源和額外模板,不包含默認控件模板。這些主題區域是你將在 generic.xaml 中看到的內容副本。

當你使用 XAML 設計工具以編輯模板和樣式的副本時,該工具會提取 XAML 設計資源詞典中的片段並將其作為應用和項目其中一部分的 XAML 字典元素的本地副本。

有關可用於使用 XAML 的 Windows 應用商店應用的特定於主題和系統資源的詳細信息和列表,請參閱 XAML 主題資源引用

Windows 8 行為

Windows 8 不支持 ThemeResource 標記擴展,該擴展自 Windows 8.1 開始提供支持。此外,Windows 8 也不支持動態切換 Windows 運行時應用的主題相關資源。必須重新啟動應用,才能應用針對 XAML 模板和樣式的主題更改。這種用戶體驗並不理想,因此強烈建議重新編譯和定位 Windows 8.1,使其能通過 ThemeResource 使用樣式,並能在用戶執行相應操作時動態切換主題。對於為 Windows 8 編譯的應用,如果其在 Windows 8.1 上運行,將繼續使用 Windows 8 行為。

 ResourceDictionary 中的前向引用

一個特定資源字典中的 XAML 資源引用必須引用定義了鍵的資源,並且從字典順序來講,該資源必須出現在資源引用之前。XAML 資源引用無法解析前向引用。出於此原因,如果你從另一個資源內使用 XAML 資源引用,則必須設計資源字典結構,以便使其他資源使用的資源在資源字典中首先定義。

在應用級別定義的資源不能引用直接資源。這相當於嘗試前向引用,因為應用資源實際上最先被處理(在應用首次啟動和加載任意導航頁內容之前)。但是,任何直接資源都可引用應用資源,這可能是避免前向引用情形的一種有用技術。

UserControl 使用范圍

對於資源查找行為,UserControl 元素有一個特殊情況,因為它有一個定義范圍和使用范圍的固有概念。從其定義范圍內進行 XAML 資源引用的 UserControl 必須能夠支持在其自己的定義范圍查找序列中查找該資源—,也就是說,它不能訪問應用資源。在 UserControl 使用范圍中,將資源引用視為在朝向其使用頁面根方向的查詢序列內(就像從加載的對象樹中的一個對象執行的任何其他資源引用一樣),並且可訪問應用資源。

ResourceDictionary 和 XamlReader.Load

你可以將 ResourceDictionary 用作根或用作 XamlReader.Load 方法的 XAML 輸入的一部分。你還可以在該 XAML 中包含 XAML 資源引用(如果所有這類引用在提交加載的 XAML 中都是完全自包含的)。XamlReader.Load 在不了解任何其他 ResourceDictionary 對象(甚至不了解 Application.Resources)的上下文中分析 XAML。 此外,請不要從 XAML 內部使用提交到 XamlReader.Load 的 {ThemeResource}

通過代碼使用 ResourceDictionary

大部分情況下,ResourceDictionary 均在 XAML 中專門處理。你要在 UI 定義文件中將內部的 ResourceDictionary容器和資源聲明為 XAML 文件或 XAML 節點集。然后使用 XAML 資源引用從 XAML 的其他部分請求這些資源。不過,在某些特定情況下,你的應用可能需要使用在應用運行時執行的代碼來調整 ResourceDictionary 的內容,或者至少需要查詢 ResourceDictionary 的內容以查看是否已定義某資源。這些代碼調用在一個 ResourceDictionary 實例上執行,所以必須首先檢索一個 —,可通過獲得 FrameworkElement.Resources 來檢索對象樹中某處的一個直接ResourceDictionary,或者檢索 Application.Current.Resources

在 C# 或 Microsoft Visual Basic 代碼中,你可以使用索引器 (Item) 引用特定 ResourceDictionary 中的資源。ResourceDictionary 是一個字符串鍵控字典,因此,索引器使用字符串鍵,而不使用整數索引。在 Visual C++ 組件擴展 (C++/CX) 代碼中,請使用 Lookup

當使用代碼檢查或更改 ResourceDictionary 時,API 的行為(如 Lookup 或 Item)不會從直接資源遍歷到應用資源,這是僅在加載 XAML 頁面時發生的 XAML 分析程序行為。在運行時,鍵作用域將自包含於此時所使用的ResourceDictionary 實例。但是,該作用域不會擴展到 MergedDictionaries 中。

另外,如果你請求的鍵不在 ResourceDictionary 中,可能不會出現錯誤;但返回值可能簡單地提供為 null。但是,如果你嘗試將返回的 null 用作值,仍然可能會出現錯誤。錯誤可能來自於屬性的設置器,而不是你的ResourceDictionary 調用。避免錯誤的唯一方法是屬性接受 null 作為有效值。請注意此行為與 XAML 解析期間的 XAML 查找行為有何區別;如果在解析期間無法解析從 XAML 提供的鍵,會導致 XAML 解析錯誤,甚至在屬性可以接受null 時也是如此。

合並的資源字典包含在主要資源字典的索引范圍內,該字典在運行時引用合並字典。換句話說,可以使用主要字典的Item 或 Lookup 查找在合並字典中實際定義的任何對象。在這種情況下,該查找行為類似於分析期間的 XAML 查找行為:如果合並字典中存在多個具有相同鍵的對象,將返回最后添加的字典中的對象。

你可以通過調用 Add(C# 或 Visual Basic)或 Insert (C++/CX) 向現有的 ResourceDictionary 添加項。你可以添加直接資源或應用資源。這些 API 調用中的每一個都需要一個鍵,這滿足 ResourceDictionary 中的每個項都有一個鍵的要求。然而,你在運行時添加到 ResourceDictionary 的項與 XAML 資源引用無關。在加載應用期間首次分析 XAML 時,將執行必要的 XAML 資源引用查找。此時,在運行時添加到集合的資源不可用,而更改 ResourceDictionary 並不會使已從中檢索到的資源失效,即使更改該資源的值也是如此。

你還可以在運行時從某個 ResourceDictionary 刪除項,復制部分或所有項,或執行其他操作。ResourceDictionary的成員列表指出了哪些 API 可用。請注意,由於 ResourceDictionary 有一個投影的 API 可支持其基本集合接口,因此你的 API 選項會有所不同,具體取決於你使用的是 C# 或 Visual Basic,還是 C++/CX。

ResourceDictionary 和本地化

XAML ResourceDictionary 最初可能包含要本地化的字符串。如果是這樣,將這些字符串存儲為項目資源,而不存儲在 ResourceDictionary 中。將字符串放在 XAML 外部,並為擁有元素提供一個 x:Uid 值。然后在資源文件中定義一個資源。以 XUIDValue.PropertyName 的形式提供資源名稱,並提供應該本地化的字符串的資源值。有關詳細信息,請參閱快速入門:翻譯 UI 資源

Windows 8.1 資源加載優化

從 Windows 8.1 開始,引入了由應用模型和 Windows 運行時 XAML 分析程序啟用的資源加載優化機制。在 Windows 8 啟動過程中,XAML 分析程序將從 app.xaml 加載資源並將其分別創建為對象。此時如果存在超大詞典則會影響其加載效率。此外,這些資源包括為三個主題定義的項目,但真正需要的僅有當前主題。從 Windows 8.1 開始,XAML 分析程序只在 XAML 資源引用專門請求資源時創建它們。這些資源可能來自其他資源或來自每個頁面加載時的頁面級 XAML。優化的 XAML 分析程序行為會將啟動時讀取應用級詞典的用時降至最低,同時使得應用的首個頁面在多數情況下加速載入。對於非活動主題所需要的資源,只有在用戶激活該主題時才會加載。運行應用的同時切換主題不是用戶經常執行的操作。但是,如果發生該情況,會根據最新的活動主題,對使用 ThemeResource 標記擴展執行請求的所有資源進行重新計算。

Windows 8 行為

Windows 8 不具備上述優化功能。由於這一原因,當你針對 Windows 8.1 重新定位應用時可能會發現計時上的差別。重新定位后的應用應該具有更快的加載速度,但是這一改進同樣離不開重新定位過程中的其他應用代碼更改的作用。對於Application 對象、轉換器或其他自定義類等對象,可能會因為優化了資源加載而發生計時方面的更改,這其中包括分析程序調用構造函數的時間。對於為 Windows 8 編譯的應用,如果其在 Windows 8.1 上運行,將繼續使用 Windows 8 行為。

自定義資源查找

對於高級方案,你可以實現其行為不同於本主題中描述的 XAML 資源引用查找行為的類。要達到此目的,你可實現類CustomXamlResourceLoader,然后可以通過使用 CustomResource 標記擴展進行資源引用(而不是使用StaticResource 或 ThemeResource)來實現該行為。大部分應用的方案將不會需要此操作。有關詳細信息,請參閱CustomXamlResourceLoader


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com