Sdílet prostřednictvím


Značkovací rozšíření {ThemeResource}

Poskytuje hodnotu pro libovolný atribut XAML tak, že vyhodnotí odkaz na prostředek a pomocí systémové logiky načítá různé prostředky v závislosti na aktuálně aktivním motivu. Podobně jako u rozšíření značek {StaticResource} jsou prostředky definovány ve slovníku prostředků a použití ThemeResource odkazuje na klíč tohoto prostředku ve slovníku ResourceDictionary.

Použití atributu XAML

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

Hodnoty XAML

Term Description
klíč Klíč požadovaného prostředku. Tento klíč je původně přiřazen ResourceDictionary. Klíč prostředku může být libovolný řetězec definovaný v jazyce XamlName Grammar.

Poznámky

ThemeResource je technika pro získání hodnot pro atribut XAML, které jsou definovány jinde ve slovníku prostředků XAML. Značková rozšíření má stejný základní účel jako značková rozšíření {StaticResource}. Rozdíl v chování oproti rozšíření značek {StaticResource} spočívá v tom, že odkaz ThemeResource může dynamicky používat různé slovníky jako primární vyhledávací umístění v závislosti na tom, který motiv aktuálně používá systém.

Při prvním spuštění aplikace se vyhodnotí všechny odkazy na prostředky vytvořené odkazem ThemeResource na základě motivu používaného při spuštění. Pokud ale uživatel později změní aktivní motiv za běhu, systém znovu vyhodnotí každý odkaz ThemeResource , načte prostředek specifický pro motiv, který se může lišit, a znovu zobrazí aplikaci s novými hodnotami prostředků na všech příslušných místech ve vizuálním stromu. StaticResource se určuje v době načítání XAML nebo spuštění aplikace a nebude se znovu vyhodnocovat za běhu. (Existují další techniky, jako jsou vizuální stavy, které dynamicky znovu načtou XAML, ale tyto techniky fungují na vyšší úrovni než základní vyhodnocení prostředků umožněné rozšířením značek {StaticResource}).

ThemeResource přebírá jeden argument, který určuje klíč požadovaného prostředku. Klíč prostředku je vždy řetězec v prostředí Windows Runtime XAML. Další informace o počátečním zadání klíče prostředku najdete v tématu x:Key – atribut.

Další informace o tom, jak definovat prostředky a správně používat ResourceDictionary, včetně ukázkového kódu, najdete v tématu Odkazy na prostředky ResourceDictionary a XAML.

Důležitý Stejně jako u StaticResource se themeResource nesmí pokoušet o předání odkazu na prostředek, který je definován lexicky dále v souboru XAML. Pokus o to není podporován. I když odkaz vpřed neselže, pokus o jeho vytvoření přináší výkonovou penalizaci. Nejlepších výsledků dosáhnete tak, že upravíte konstrukci slovníků prostředků tak, aby se zabránilo dopředným odkazům.

Pokus o zadání ThemeResource pro klíč, který nelze vyřešit, vyvolá výjimku analýzy XAML za běhu. Nástroje pro návrh můžou také nabízet upozornění nebo chyby.

V implementaci procesoru XAML ve Windows Runtime neexistuje reprezentace základní třídy pro ThemeResource. Nejbližším ekvivalentem v kódu je použití rozhraní API kolekce ResourceDictionary, například volání Contains nebo *TryGetValue.

ThemeResource je rozšíření pro značkovací jazyk. Rozšíření značek se obvykle implementují, pokud existuje požadavek, aby hodnoty atributů byly jiné než literální hodnoty nebo názvy handlerů, a požadavek je globálnější než jen vkládání převaděčů typů na určité typy nebo vlastnosti. Všechna rozšíření značek v XAML používají znaky {a "}" v syntaxi atributů, což je konvence, kterou procesor XAML rozpozná, že rozšíření značek musí atribut zpracovat.

Kdy a jak používat {ThemeResource} místo {StaticResource}

Pravidla, podle kterých ThemeResource vyřeší na položku ve slovníku prostředků, jsou obecně stejná jako StaticResource. Vyhledávání ThemeResource lze rozšířit do souborů ResourceDictionary, které jsou odkazovány v kolekci ThemeDictionaries, ale StaticResource to může udělat také. Rozdíl je v tom, že themeResource může znovu vyhodnotit za běhu a StaticResource nemůže.

Sada klíčů v každém slovníku motivů by měla poskytovat stejnou sadu klíčových prostředků bez ohledu na to, který motiv je aktivní. Pokud daný klíčovaný prostředek existuje ve slovníku motivu HighContrast, měl by existovat také prostředek s tímto názvem v Light a Default. Pokud to není pravda, vyhledávání prostředků může selhat, když uživatel přepne témata a vaše aplikace nebude vypadat správně. Je však možné, že slovník motivů může obsahovat klíčové prostředky, na které odkazují pouze ve stejném oboru, aby poskytoval dílčí hodnoty; ty nemusí být ve všech motivech ekvivalentní.

Obecně byste měli prostředky umístit do slovníků motivů a odkazovat na tyto prostředky pomocí ThemeResource pouze tehdy, když se tyto hodnoty můžou mezi motivy měnit nebo jsou podporovány hodnotami, které se mění. To je vhodné pro tyto druhy prostředků:

  • Štětce, zejména barvy používané pro SolidColorBrush. Tvoří přibližně 80% použití ThemeResource ve výchozích šablonách ovládacího prvku XAML (generic.xaml).
  • Hodnoty pixelů pro ohraničení, posuny, okraje a odsazení atd.
  • Vlastnosti písma, jako je FontFamily nebo FontSize.
  • Kompletní šablony pro omezený počet ovládacích prvků, které jsou obvykle stylizované systémem a používají se pro dynamickou prezentaci, jako GridViewItem a ListViewItem.
  • Styly zobrazení textu (obvykle ke změně barvy písma, pozadí a případně velikosti).

Modul Windows Runtime poskytuje sadu prostředků, na které se konkrétně odkazuje ThemeResource. Všechny jsou uvedené jako součást souboru XAML themeresources.xaml, který je k dispozici ve složce include/winrt/xaml/design jako součást sady Windows Software Development Kit (SDK). Dokumentaci k štětcům motivu a dalším stylům definovaným v themeresources.xaml najdete v tématu Prostředky motivu XAML. Štětce jsou zdokumentované v tabulce, ve které se dozvíte, jakou hodnotu barvy každý štětec má pro každý ze tří možných aktivních motivů.

Definice vizuálních stavů v šabloně ovládacího prvku by měly používat odkazy ThemeResource vždy, když existuje podkladový zdroj, který se může změnit kvůli změně motivu. Změna motivu systému obvykle nezpůsobí také změnu vizuálního stavu. Prostředky musí v tomto případě používat odkazy ThemeResource, aby bylo možné hodnoty znovu vyhodnotit pro stále aktivní stav vizuálu. Pokud máte například vizuální stav, který změní barvu štětce konkrétní části uživatelského rozhraní a jednu z jejích vlastností a barva štětce se liší podle motivu, měli byste použít odkaz ThemeResource pro poskytnutí hodnoty této vlastnosti ve výchozí šabloně a také všechny změny stavu vizuálu této výchozí šablony.

Použití ThemeResource může být vidět v řadě závislých hodnot. Například hodnota Color používaná SolidColorBrush, která je také klíčovaným prostředkem, může použít odkaz ThemeResource. Všechny vlastnosti uživatelského rozhraní, které používají klíčovaný prostředek SolidColorBrush , by také používaly odkaz ThemeResource , takže je to konkrétně každá vlastnost typu Brush, která umožňuje dynamickou změnu hodnoty při změně motivu.

Poznámka{ThemeResource} a vyhodnocování prostředků za běhu při přepínání motivů je podporováno v XAML pro systém Windows 8.1, ale není podporováno v XAML pro aplikace, které cílí na Windows 8.

Systémové prostředky

Některé prostředky motivu odkazují na systémové hodnoty prostředků jako podkladovou dílčí hodnotu. Systémový prostředek je speciální hodnota prostředku, která se nenachází ve slovníku prostředků XAML. Tyto hodnoty spoléhají na chování v podpoře XAML modulu Windows Runtime k předávání hodnot ze samotného systému a představují je ve formě, na kterou může prostředek XAML odkazovat. Existuje například systémový prostředek s názvem SystemColorButtonFaceColor, který představuje barvu RGB. Tato barva pochází z aspektů systémových barev a motivů, které nejsou specifické jenom pro prostředí Windows Runtime a aplikace prostředí Windows Runtime.

Systémové prostředky jsou často podkladovými hodnotami motivu s vysokým kontrastem. Uživatel má kontrolu nad možnostmi barev pro motiv s vysokým kontrastem a uživatel provede tyto volby pomocí systémových funkcí, které také nejsou specifické pro aplikace windows Runtime. Odkazováním na systémové prostředky jako odkazy ThemeResource může výchozí chování motivů s vysokým kontrastem pro aplikace prostředí Windows Runtime používat tyto hodnoty specifické pro motivy, které jsou řízeny uživatelem a vystaveny systémem. Odkazy jsou také označeny k opětovnému vyhodnocení, pokud systém zjistí změnu motivu během běhu systému.

Příklad využití {ThemeResource}

Tady je příklad XAML převzatý z výchozích souborů generic.xaml a themeresources.xaml, které ilustrují, jak používat ThemeResource. Podíváme se na jenom jednu šablonu (výchozí tlačítko) a na to, jak se deklarují dvě vlastnosti (Background a Foreground), aby reagovaly na změny motivu.

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

Zde vlastnosti přebírají hodnotu Brush a odkaz na prostředky SolidColorBrush pojmenované ButtonBackgroundThemeBrush a ButtonForegroundThemeBrush jsou vytvořeny pomocí ThemeResource.

Tyto stejné vlastnosti mohou být upraveny některými vizuálními stavy pro tlačítko. Barva pozadí se zejména změní, když na tlačítko kliknete. Zde také animace Background a Foreground ve storyboardu vizuálního stavu používají objekty DiscreteObjectKeyFrame a odkazy na štětce s použitím ThemeResource jako hodnotu klíčového snímku.

<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>

Každý z těchto štětců je definován dříve v generic.xaml: musely být definovány před jakoukoli šablonou, která je používá, aby se zabránilo přeposílání odkazů XAML. Tady jsou tyto definice pro slovník motivů Výchozí.

    <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" />
...

Každý z ostatních slovníků motivů má také definované tyto štětce, například:

        <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}" />

Hodnota Color je další odkaz ThemeResource na systémový prostředek. Pokud odkazujete na systémový prostředek a chcete, aby se změnil v reakci na změnu motivu, měli byste použít ThemeResource k vytvoření odkazu.

Podpora nástrojů návrhového času pro rozšíření značek {ThemeResource}

Microsoft Visual Studio může ve výběrovém seznamu Microsoft IntelliSense zahrnovat možné hodnoty klíčů při použití značkovacího rozšíření {ThemeResource} na stránce XAML. Například jakmile zadáte {ThemeResource, zobrazí se všechny klíče prostředků z prostředků motivu XAML .

Jakmile klíč prostředku existuje jako součást jakéhokoli použití {ThemeResource}, funkce Přejít k definici (F12) dokáže tento prostředek vyhledat a zobrazit generic.xaml v čase návrhu, kde je prostředek motivu definovaný. Vzhledem k tomu, že prostředky motivu jsou definovány více než jednou (pro jednotlivé téma), Přejít na definici vás zavede k první nalezené definici v souboru, což je definice pro Výchozí. Pokud chcete definice ostatních témat, vyhledejte název klíče v souboru a najděte definice těchto témat.