共用方式為


{ThemeResource} 標記擴充

通過評估對資源的引用,動態地為任何 XAML 屬性提供值,並使用額外的系統邏輯根據當前活動的主題檢索不同的資源。 類似於 {StaticResource} 標記延伸模組,資源是在 ResourceDictionary 中定義,而 ThemeResource 使用方式會參考 ResourceDictionary 中該資源的索引鍵。

XAML 屬性使用方式

<object property="{ThemeResource key}" .../>

XAML 值

術語 Description
Key 所要求資源的金鑰。 此索引鍵最初是由 ResourceDictionary 指派的。 資源索引鍵可以是 XamlName 文法中定義的任何字串。

備註

ThemeResource 是一種技術,用於取得 XAML 資源字典中其他位置所定義的 XAML 屬性值。 標記延伸模組的基本用途與 {StaticResource} 標記延伸模組相同。 與 {StaticResource} 標記延伸模組的行為不同,ThemeResource 參考能夠根據系統當前使用的主題,動態選擇不同的字典作為主要查閱位置。

當應用程式第一次啟動時,會根據啟動時使用的主題來判斷 ThemeResource 所參考的任何資源。 但是,如果使用者後續在執行階段變更作用中主題,系統會重新評估每個 ThemeResource 參考、擷取可能不同的主題特定資源,並在視覺化樹狀結構中的所有適當位置重新顯示具有新資源值的應用程式。 StaticResource 會在 XAML 載入時間/應用程式啟動時決定,而且不會在執行階段重新評估。 (還有其他技術,例如動態重新載入 XAML 的視覺狀態技術,但這些技術在比{StaticResource} 標記延伸模組所啟用的基本資源評估更高的層次上運作)。

ThemeResource 會採用一個引數,以指定所要求資源的索引鍵。 資源索引鍵一律是 Windows 執行階段 XAML 中的字串。 如需一開始如何指定資源索引鍵的詳細資訊,請參閱 x:Key 屬性

如需如何定義資源和正確使用 ResourceDictionary (包括範例程式碼) 的詳細資訊,請參閱 ResourceDictionary 和 XAML 資源參考

重要 如同 StaticResourceThemeResource 不得嘗試先前參考在 XAML 檔案中後面定義的資源。 不支援嘗試這樣做。 即使前向參考沒有失敗,嘗試進行一個也會產生性能損失。 為了獲得最佳結果,請調整資源字典的組成,以避免正向參照。

嘗試將 ThemeResource 指定給無法解析的索引鍵,會在執行階段引發 XAML 解析例外。 設計工具也可能提供警告或錯誤。

在 Windows 執行階段 XAML 處理器實作中,沒有 ThemeResource 的基礎類別表示。 程式碼中最接近的對等專案是使用 ResourceDictionary 的集合 API,例如呼叫 Contains 或 *TryGetValue

ThemeResource 是標記延伸模組。 當需要轉義屬性值為非文字值或處理常式名稱時,通常會實作標記擴充,比僅放在某些類型或屬性上的型別轉換器更具普遍性。 XAML 中的所有標記延伸模組都會在其屬性語法中使用 “{” 和 “}” 字元,這是 XAML 處理器辨識標記延伸模組必須處理屬性的慣例。

何時以及如何使用 {ThemeResource} 而不是 {StaticResource}

ThemeResource 解析為資源字典中項目的規則通常與 StaticResource 相同。 ThemeResource 查閱可以延伸至 ThemeDictionaries 集合中參考的 ResourceDictionary 檔案,但 StaticResource 也可以執行此動作。 差異在於 ThemeResource 可以在執行階段重新評估,而 StaticResource 則不能。

無論哪個主題處於作用中狀態,每個主題字典中的索引鍵集都應該提供相同的索引鍵資源集。 如果 HighContrast 主題字典中存在指定的索引鍵資源,則具有該名稱的另一個資源也應該存在於 LightDefault 中。 如果這不是真的,當使用者切換主題時,資源查詢可能會失敗,而且您的應用程式看起來不會正確。 不過,主題字典可能包含具有鍵值的資源,這些資源只能在相同範圍內參考,以提供子值,這些資源不必在所有主題中保持一致。

一般而言,您應該將資源放在主題字典中,並只有在這些值可以在主題之間變更,或受到變更值支援時,才使用 ThemeResource 來參考這些資源。 這適用於下列類型的資源:

  • 筆刷,尤其是 SolidColorBrush 的顏色。 這些會構成預設 XAML 控制項範本 (generic.xaml) 中大約 80% 的 ThemeResource 使用方式。
  • 邊框、偏移、外邊距和內邊距等的像素值。
  • 字型屬性,例如 FontFamilyFontSize
  • 針對通常為系統樣式並用於動態呈現的有限數量控制項的完整範本,例如 GridViewItemListViewItem
  • 文字顯示樣式 (通常用於變更字型色彩、背景,以及可能的大小)。

Windows 執行階段提供一組特別要由 ThemeResource 參考的資源。 這些都列為 XAML 檔案 themeresources.xaml 的一部分,該檔案可在 include/winrt/xaml/design 資料夾中作為 Windows 軟體開發套件 (SDK) 的一部分。 如需了解在themeresources.xaml中定義的主題筆刷和其他樣式的文件,請參閱 XAML 主題資源。 筆刷記錄在表格中,該表格告訴您每個筆刷對於三個可能的作用中主題中的每一個都有什麼顏色值。

控制項範本中視覺狀態的 XAML 定義應該在基礎資源可能因為主題變更而變更時使用 ThemeResource 參考。 系統主題變更通常也不會造成視覺狀態變更。 在此情況下,資源必須使用 ThemeResource 參考,以便針對仍在作用中的視覺狀態重新評估值。 例如,如果您的視覺狀態會變更特定 UI 組件及其其中一個屬性的筆刷色彩,而且該筆刷色彩會因主題而異,您應該使用 ThemeResource 參考來在預設範本中提供該屬性的值,以及該預設範本的任何視覺狀態修改。

ThemeResource 使用方式可能會出現在一系列相依值中。 例如,SolidColorBrush 所使用的 Color 值 (也是索引鍵資源) 可能會使用 ThemeResource 參考。 但是,任何使用索引鍵 SolidColorBrush 資源的 UI 屬性也會使用 ThemeResource 參考,因此當主題變更時,每個 Brush 類型屬性都會啟用動態值變更。

注意{ThemeResource} Windows 8.1 XAML 支援主題切換的執行階段資源評估,但 XAML 不支援以 Windows 8 為目標的應用程式。

系統資源

某些佈景主題資源會參考系統資源值作為基礎子值。 系統資源是在任何 XAML 資源字典中找不到的特殊資源值。 這些值依賴 Windows 執行階段 XAML 支援中的行為,從系統本身轉送值,並以 XAML 資源可以參考的形式表示它們。 例如,有一個名為 “SystemColorButtonFaceColor” 的系統資源,代表 RGB 色彩。 此顏色源自系統顏色和主題的元素,不僅限於 Windows 執行階段及其應用程式。

系統資源通常是高對比主題的基礎值。 使用者可以控制其高對比主題的色彩選擇,而且使用者會使用也不特定於 Windows 執行階段應用程式的系統功能來做出這些選擇。 藉由將系統資源參考為 ThemeResource 參考,Windows 執行階段應用程式高對比主題的預設行為可以使用這些由使用者控制並由系統公開的主題特定值。 此外,如果系統偵測到執行階段主題變更,現在會標示參考以重新評估。

{ThemeResource} 用法範例

以下是從預設 generic.xaml 和 themeresources.xaml 檔案取得的一些範例 XAML,以說明如何使用 ThemeResource。 我們將只查看一個模板(默認的 Button)以及如何聲明兩個屬性(BackgroundForeground)以響應主題更改。

    <!-- Default style for Windows.UI.Xaml.Controls.Button -->
    <Style TargetType="Button">
        <Setter Property="Background" Value="{ThemeResource ButtonBackgroundThemeBrush}" />
        <Setter Property="Foreground" Value="{ThemeResource ButtonForegroundThemeBrush}"/>
...

在這裡,屬性具有 Brush 的值,並以 ThemeResource 引用名為 ButtonBackgroundThemeBrushButtonForegroundThemeBrushSolidColorBrush 資源。

這些相同的屬性也會由 Button 的某些視覺狀態調整。 值得注意的是,當單擊按鈕時,背景顏色會發生變化。 在這裡,視覺狀態分鏡腳本中的 背景前景 動畫也會使用 DiscreteObjectKeyFrame 物件,並參考以 ThemeResource 作為關鍵影格值的筆刷。

<VisualState x:Name="Pressed">
  <Storyboard>
    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Border"
        Storyboard.TargetProperty="Background">
      <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ButtonPressedBackgroundThemeBrush}" />
    </ObjectAnimationUsingKeyFrames>
    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter"
         Storyboard.TargetProperty="Foreground">
       <DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ButtonPressedForegroundThemeBrush}" />
    </ObjectAnimationUsingKeyFrames>
  </Storyboard>
</VisualState>

每個筆刷都較早在 generic.xaml 中定義:必須先定義它們,才能使用任何範本,以避免 XAML 正向參考。 以下是「預設」主題字典的定義。

    <ResourceDictionary.ThemeDictionaries>
        <ResourceDictionary x:Key="Default">
...
            <SolidColorBrush x:Key="ButtonBackgroundThemeBrush" Color="Transparent" />
            <SolidColorBrush x:Key="ButtonForegroundThemeBrush" Color="#FFFFFFFF" />
...
            <SolidColorBrush x:Key="ButtonPressedBackgroundThemeBrush" Color="#FFFFFFFF" />
            <SolidColorBrush x:Key="ButtonPressedForegroundThemeBrush" Color="#FF000000" />
...

然後,其他每個主題字典也定義了這些筆刷,例如:

        <ResourceDictionary x:Key="HighContrast">
            <!-- High Contrast theme resources -->
...
            <SolidColorBrush x:Key="ButtonBackgroundThemeBrush" Color="{ThemeResource SystemColorButtonFaceColor}" />
            <SolidColorBrush x:Key="ButtonForegroundThemeBrush" Color="{ThemeResource SystemColorButtonTextColor}" />

...
            <SolidColorBrush x:Key="ButtonPressedBackgroundThemeBrush" Color="{ThemeResource SystemColorButtonTextColor}" />
            <SolidColorBrush x:Key="ButtonPressedForegroundThemeBrush" Color="{ThemeResource SystemColorButtonFaceColor}" />

這裡的 Color 值是系統資源的另一個 ThemeResource 參考。 如果您引用系統資源,並希望它在主題變更時做出變更,您應該使用 ThemeResource 來進行引用。

{ThemeResource} 標記延伸模組的設計階段工具支援

當您在 XAML 頁面中使用 {ThemeResource} 標記延伸模組時,Microsoft Visual Studio 可以在 Microsoft IntelliSense 下拉式清單中包含可能的鍵值。 例如,只要您輸入 “{ThemeResource”,就會顯示 XAML 主題資源 中的任何資源索引鍵。

一旦資源索引鍵作為任何 {ThemeResource} 使用方式的一部分存在,移 至定義 (F12) 功能就可以解析該資源,並顯示設計階段的 generic.xaml,其中定義了主題資源。 由於佈景主題資源會定義多次 (每個佈景主題),因此 「移至定義」 會將您帶到檔案中找到的第一個定義,也就是 「預設」的定義。 如果您想要其他定義,您可以在檔案中搜尋索引鍵名稱,並尋找其他主題的定義。