Megosztás:


{ThemeResource} korrektúrakiterjesztés

Bármely XAML-attribútumhoz értéket biztosít egy erőforrásra mutató hivatkozás kiértékelésével, valamint további rendszerlogikával, amely a jelenleg aktív témától függően különböző erőforrásokat kér le. A {StaticResource} korrektúrakiterjesztéshez hasonlóan az erőforrások egy ResourceDictionary-ban vannak definiálva, a ThemeResource-használat pedig az adott erőforrás kulcsára hivatkozik a ResourceDictionaryban.

XAML-attribútumok használata

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

XAML-értékek

Időszak Description
kulcs A kért erőforrás kulcsa. Ezt a kulcsot kezdetben a ResourceDictionary rendeli hozzá. Az erőforráskulcs az XamlName nyelvhelyességben definiált bármely sztring lehet.

Megjegyzések

A ThemeResource egy XAML-attribútum értékeinek lekérésére szolgáló technika, amely egy XAML-erőforrásszótár máshol van definiálva. A korrektúra-bővítmény ugyanazt az alapvető célt szolgálja, mint a {StaticResource} korrektúrakiterjesztés. A viselkedés és a {StaticResource} korrektúrakiterjesztés közötti különbség az, hogy a ThemeResource-referencia dinamikusan használhat különböző szótárakat elsődleges keresési helyként attól függően, hogy a rendszer melyik témát használja jelenleg.

Az alkalmazás első indításakor a ThemeResource-referencia által készített erőforrás-referenciák kiértékelése az indításkor használt téma alapján történik. Ha azonban a felhasználó később futtatáskor módosítja az aktív témát, a rendszer újra kiértékeli az összes ThemeResource-hivatkozást , lekér egy témaspecifikus erőforrást, amely eltérő lehet, és a vizualizációfa minden megfelelő helyén újra megjeleníti az alkalmazást új erőforrásértékekkel. A StaticResource az XAML betöltési időpontban/alkalmazás indításkor van meghatározva, és futásidőben nem lesz újra kiértékelve. (Vannak más technikák, például vizualizációs állapotok, amelyek dinamikusan újratöltik az XAML-t, de ezek a technikák magasabb szinten működnek, mint a {StaticResource} korrektúrakiterjesztés által engedélyezett alapszintű erőforrás-kiértékelés).

A ThemeResource egy argumentumot használ, amely megadja a kért erőforrás kulcsát. Az erőforráskulcsok mindig sztringek a Windows Runtime XAML-ben. További információ az erőforráskulcs kezdeti megadásáról: x:Key attribútum.

További információ az erőforrások definiálásáról és a ResourceDictionary megfelelő használatáról, beleértve a mintakódot is: ResourceDictionary és XAML erőforráshivatkozások.

Fontos A StaticResource-hoz hasonlóan a ThemeResource sem kísérelhet meg tovább hivatkozni az XAML-fájlban lexikálisan definiált erőforrásra. Ennek megkísérlése nem támogatott. Ha a továbbítási hivatkozás mégsem hiúsul meg, a megkísérlése teljesítménybeli hátrányt jelent. A legjobb eredmény érdekében módosítsa az erőforrás-szótárak összetételét, hogy a továbbítási hivatkozások elkerülhetők legyenek.

Ha megkísérli megadni a ThemeResource-t egy olyan kulcshoz, amely nem oldható fel, xAML-elemzési kivételt eredményez futásidőben. A tervezőeszközök figyelmeztetéseket vagy hibákat is tartalmazhatnak.

A Windows Runtime XAML processzor implementációjában nincs háttérosztály-reprezentáció a ThemeResource-hoz. A kód legközelebbi megfelelője egy ResourceDictionary gyűjtemény API-jának használata, például a Contains vagy a *TryGetValue meghívása.

ThemeResource jelölőnyelvi kiterjesztés. A korrektúrakiterjesztések általában akkor implementálódnak, ha az attribútumértékek nem konstansértékek vagy kezelőnevek, és a követelmény globálisabb, mint a típuskonverterek bizonyos típusok vagy tulajdonságok esetében való elhelyezése. Az XAML-ben az összes korrektúrakiterjesztés az attribútumszintaxisában a "{" és a "}" karaktert használja, ez az a konvenció, amellyel az XAML-feldolgozó felismeri, hogy egy korrektúrakiterjesztésnek fel kell dolgoznia az attribútumot.

Mikor és hogyan használható a {ThemeResource} a {StaticResource} helyett

Azok a szabályok, amelyekkel a ThemeResource feloldható egy erőforrás-szótár egy elemére, általában megegyeznek a StaticResource-tal. A ThemeResource-keresések kiterjedhetnek a ThemeDictionaries gyűjteményben hivatkozott ResourceDictionary-fájlokra, de a StaticResource is képes erre. A különbség az, hogy a ThemeResource futásidőben újra kiértékelhető, a StaticResource pedig nem.

Az egyes témaszótárak kulcskészletének ugyanazokat a kulcsokkal rendelkező erőforrásokat kell biztosítania, függetlenül attól, hogy melyik téma aktív. Ha egy adott kulcsos erőforrás létezik a HighContrast témaszótárban, akkor az ilyen nevű erőforrásnak a Világos és az Alapértelmezett értékben is léteznie kell. Ha ez nem igaz, az erőforrás-keresés meghiúsulhat, ha a felhasználó témákat vált, és az alkalmazás nem fog jól kinézni. Lehetséges azonban, hogy a témaszótárak olyan kulcsos erőforrásokat tartalmazhatnak, amelyekre csak ugyanazon a hatókörön belülről hivatkoznak, hogy alértékeket adjanak meg; ezeknek nem kell minden témában egyenértékűnek lenniük.

Általánosságban elmondható, hogy az erőforrásokat a témaszótárakban kell elhelyeznie, és csak akkor kell hivatkoznia ezekre az erőforrásokra a ThemeResource használatával, ha ezek az értékek változhatnak a témák között, vagy ha a változó értékek támogatják őket. Ez az alábbi típusú erőforrásokhoz megfelelő:

  • Ecsetek, különösen a SolidColorBrush színei. Ezek körülbelül 80% alkotnak a ThemeResource-használatból az alapértelmezett XAML-vezérlősablonokban (generic.xaml).
  • Képpontértékek szegélyekhez, eltolásokhoz, margóhoz és kitöltéshez stb.
  • A betűtípus tulajdonságai, például a FontFamily vagy a FontSize.
  • Kész sablonok korlátozott számú vezérlőhöz, amelyek általában rendszerstílusúak és dinamikus bemutatókhoz használhatók, például a GridViewItemhez és a ListViewItemhez.
  • Szövegmegjelenítési stílusok (általában a betűszín, a háttér és esetleg a méret módosítása).

A Windows futtatókörnyezet olyan erőforrásokat biztosít, amelyekre kifejezetten a ThemeResource hivatkozik. Ezek mind az XAML-fájl themeresources.xaml részeként jelennek meg, amely a Windows Software Development Kit (SDK) részeként elérhető az include/winrt/xaml/design mappában. A témakefék és a themeresources.xaml alkalmazásban definiált további stílusok dokumentációját az XAML témaerőforrásaiban találja. Az ecsetek egy táblázatban vannak dokumentálva, amely megmutatja, hogy az egyes ecsetek milyen színértékeket tartalmaznak a három lehetséges aktív téma mindegyikéhez.

A vezérlősablon vizualizációs állapotainak XAML-definícióinak ThemeResource-hivatkozásokat kell használniuk, amikor egy mögöttes erőforrás módosulhat a téma módosítása miatt. A rendszertémák módosítása általában nem okoz vizuális állapotváltozást. Az erőforrásoknak ebben az esetben ThemeResource-hivatkozásokat kell használniuk, hogy az értékek újra kiértékelhetők legyenek a még aktív vizualizációs állapotban. Ha például olyan vizualizációs állapotban van, amely megváltoztatja egy adott felhasználói felület egy részének ecsetszínét és annak egyik tulajdonságát, és az ecset színe témánként eltérő, akkor a ThemeResource referenciát kell használnia a tulajdonság értékének az alapértelmezett sablonban való megadásához, valamint az alapértelmezett sablon vizualizációs állapotának módosításához.

A ThemeResource-használatok függő értékek sorozatában tekinthetők meg. Például egy solidColorBrush által használt színérték, amely szintén kulcsos erőforrás, egy ThemeResource-hivatkozást használhat. Azok a felhasználói felületi tulajdonságok, amelyek a kulcsos SolidColorBrush erőforrást használják, szintén ThemeResource hivatkozásokat alkalmaznak. Ezáltal kifejezetten az egyes Ecset típusú tulajdonságok azok, amelyek lehetővé teszik a dinamikus értékváltozást, amikor a téma megváltozik.

Jegyzet{ThemeResource} és a témaváltás futásidejű erőforrás-kiértékelése támogatott a Windows 8.1 XAML-ben, de az XAML nem támogatja a Windows 8-at célzó alkalmazások esetében.

Rendszererőforrások

Egyes témaerőforrások a rendszererőforrás-értékeket alapul szolgáló alértékként hivatkoznak. A rendszererőforrás egy speciális erőforrásérték, amely egyetlen XAML-erőforrásszótárban sem található. Ezek az értékek a Windows Runtime XAML-támogatás viselkedésén alapulnak, hogy maguktól a rendszertől továbbítják az értékeket, és olyan formában jelölik őket, amelyre egy XAML-erőforrás hivatkozhat. Létezik például egy "SystemColorButtonFaceColor" nevű rendszer erőforrás, amely egy RGB színt reprezentál. Ez a szín a rendszerszínek és a témák olyan aspektusaiból származik, amelyek nem csak a Windows futtatókörnyezetre és a Windows futtatókörnyezeti alkalmazásokra vonatkoznak.

A rendszererőforrások gyakran a kontrasztos témák alapjául szolgáló értékek. A felhasználó felügyeli a kontrasztos téma színbeállításait, és a felhasználó ezeket a választási lehetőségeket olyan rendszerfunkciók használatával hozza meg, amelyek szintén nem a Windows futtatókörnyezeti alkalmazásokra vonatkoznak. Ha a rendszererőforrásokat ThemeResource-hivatkozásként hivatkozik, a Windows Runtime-alkalmazások kontrasztos témáinak alapértelmezett viselkedése ezeket a témaspecifikus értékeket használhatja, amelyeket a felhasználó vezérel, és amelyeket a rendszer elérhetővé tett. Emellett a hivatkozások újraértékelésre vannak megjelölve, ha a rendszer futásidejű témaváltozást észlel.

Példa {ThemeResource} használatára

Íme néhány példa az XAML-re az alapértelmezett generic.xaml és themeresources.xaml fájlokból a ThemeResource használatának szemléltetéséhez. Csak egy sablont (az alapértelmezett gombot) és a két tulajdonság deklarálhatóságát (Háttér és Előtér) tekintjük meg, hogy reagáljanak a témamódosításokra.

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

Itt a tulajdonságok Brush értéket vesznek fel, és a SolidColorBrush erőforrásokra való hivatkozást ButtonBackgroundThemeBrushButtonForegroundThemeBrusha ThemeResource használatával készítik el.

Ezeket a tulajdonságokat a gomb egyes vizualizációs állapotai is módosítják. Nevezetesen a háttérszín megváltozik, amikor egy gombra kattint. A vizuális állapot forgatókönyv itt is háttér és előtér animációi számára DiscreteObjectKeyFrame objektumokat és a ThemeResource-ot mint kulcskeret értékét használó ecsetekre mutató hivatkozásokat használ.

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

Ezek az ecsetek a generic.xaml fájlban vannak korábban definiálva: meg kellett őket határozni minden olyan sablon előtt, amely használja őket, az XAML előre hivatkozásainak elkerülése érdekében. Ezek a definíciók az "Alapértelmezett" témaszótárhoz tartoznak.

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

Ezután a többi témaszótár is tartalmazza ezeket a keféket, például:

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

Itt a Szín érték egy másik ThemeResource-hivatkozás egy rendszererőforrásra. Ha egy rendszererőforrásra hivatkozik, és azt szeretné, hogy a témamódosításra válaszul megváltozzon, használja a ThemeResource-t a hivatkozáshoz.

A (z) {ThemeResource} korrektúrabővítmény tervezésekor használható eszközök támogatása

A Microsoft Visual Studio tartalmazhat lehetséges kulcsértékeket a Microsoft IntelliSense legördülő listájában, ha a {ThemeResource} jelölőbővítményt egy XAML-lapon használja. Ha például a(z) {ThemeResource kifejezést írja be, megjelenik az XAML témaerőforrásainak bármelyik erőforráskulcsa.

Ha egy erőforráskulcs a {ThemeResource} bármely használata részeként létezik, az F12 (Go To Definition) funkció feloldhatja az erőforrást, és megjelenítheti a generic.xaml-t tervezéskor, ahol a témaerőforrás definiálva van. Mivel a témaerőforrások több alkalommal vannak definiálva (téma szerint) Az Ugrás a definícióra lépés a fájlban található első definícióhoz vezet, amely az Alapértelmezett definíció. Ha a többi definíciót szeretné, keresse meg a kulcs nevét a fájlban, és keresse meg a többi téma definícióit.