Rozšíření značek a WPF XAML

Toto téma představuje koncept rozšíření značek pro XAML, včetně jejich pravidel syntaxe, účelu a objektového modelu třídy, který je tvoří základ. Rozšíření značek jsou obecnou funkcí jazyka XAML a implementace služeb XAML .NET. Toto téma podrobně popisuje rozšíření značek pro použití ve WPF XAML.

Procesory XAML a rozšíření značek

Obecně řečeno, analyzátor XAML může interpretovat hodnotu atributu jako literálový řetězec, který lze převést na primitivní, nebo ho nějakým způsobem převést na objekt. Jedním z takových prostředků je odkazování na převaděč typů; toto je dokumentováno v tématu TypeConverters a XAML. Existují však scénáře, ve kterých se vyžaduje jiné chování. Například procesor XAML lze instruovat, že hodnota atributu by neměla vést k novému objektu v grafu objektu. Místo toho by měl atribut vést k grafu objektů, který vytváří odkaz na již vytvořený objekt v jiné části grafu nebo na statický objekt. Dalším scénářem je, že procesor XAML může být instruován k použití syntaxe, která poskytuje konstruktoru objektu jiné než výchozí argumenty. Jedná se o typy scénářů, ve kterých může rozšíření značek poskytnout řešení.

Syntaxe rozšíření základní značky

Rozšíření značek lze implementovat tak, aby poskytovalo hodnoty vlastností v použití atributu, vlastnosti v použití elementu vlastnosti nebo obojí.

Pokud se používá k zadání hodnoty atributu, syntaxe, která rozlišuje posloupnost rozšíření značek na procesor XAML, je přítomnost levých a uzavíracích složených závorek ({ a }). Typ rozšíření značek se pak identifikuje pomocí tokenu řetězce bezprostředně za levou složenou závorkou.

Pokud se používá v syntaxi elementu property, rozšíření značek je vizuálně stejné jako jakýkoli jiný prvek sloužící k poskytnutí hodnoty elementu vlastnosti: deklarace elementu XAML, která odkazuje na třídu rozšíření značek jako prvek, uzavřený uvnitř úhlových závorek (<>).

Rozšíření značek definovaná XAML

Existuje několik rozšíření značek, které nejsou specifické pro implementaci WPF XAML, ale jsou spíše implementace vnitřních objektů nebo funkcí XAML jako jazyk. Tato rozšíření značek jsou implementována v sestavení System.Xaml jako součást obecných služeb XAML rozhraní .NET Framework a jsou v oboru názvů XAML jazyka XAML. Pokud jde o běžné použití značek, tato rozšíření značek jsou obvykle identifikovatelná předponou x: v použití. Základní MarkupExtension třída (také definovaná v System.Xaml) poskytuje vzor, který by měla používat všechna rozšíření značek, aby byla podporována v zapisovačích XAML a zapisovačích XAML, včetně WPF XAML.

  • x:TypeType poskytuje objekt pro pojmenovaný typ. Toto zařízení se nejčastěji používá ve stylech a šablonách. Podrobnosti najdete v tématu x:Type Markup Extension.

  • x:Static vytváří statické hodnoty. Hodnoty pocházejí z entit kódu typu hodnota, které nejsou přímo typem hodnoty cílové vlastnosti, ale lze je vyhodnotit na tento typ. Podrobnosti najdete v tématu x:Static Markup Extension.

  • x:Null určuje null jako hodnotu vlastnosti a lze ji použít buď pro atributy, nebo hodnoty elementu vlastnosti. Podrobnosti najdete v tématu x:Null Markup Extension.

  • x:Array poskytuje podporu pro vytváření obecných polí v syntaxi XAML, pro případy, kdy se podpora kolekce poskytovaná základními prvky WPF a řídicími modely záměrně nepoužívá. Podrobnosti najdete v tématu x:Array Markup Extension.

Poznámka:

Předpona x: se používá pro typické mapování oboru názvů XAML vnitřních objektů jazyka XAML v kořenovém prvku souboru XAML nebo v produkčním prostředí. Například šablony sady Visual Studio pro aplikace WPF iniciují soubor XAML pomocí tohoto x: mapování. Ve vlastním mapování oboru názvů XAML můžete zvolit jiný token předpony, ale tato dokumentace předpokládá výchozí x: mapování jako prostředek identifikace entit, které jsou definovanou součástí oboru názvů XAML pro jazyk XAML, a ne výchozí obor názvů WPF nebo jiné obory názvů XAML nesouvisejí s konkrétní architekturou.

Rozšíření značek specifická pro WPF

Nejběžnější rozšíření značek používaná v programování WPF jsou ty, které podporují odkazy na prostředky (StaticResourceDynamicResourcea ) a ty, které podporují datové vazby (Binding).

  • StaticResource poskytuje hodnotu vlastnosti nahrazením hodnoty již definovaného prostředku. Vyhodnocení StaticResource se nakonec provede v době načtení XAML a nemá přístup k grafu objektů za běhu. Podrobnosti najdete v tématu Rozšíření značek StaticResource.

  • DynamicResource poskytuje hodnotu vlastnosti odložením této hodnoty odkazem na prostředek za běhu. Dynamické odkazy na prostředky vynutí nové vyhledávání pokaždé, když je takový prostředek přístupný a má přístup k grafu objektů za běhu. Pro získání tohoto přístupu DynamicResource je koncept podporován vlastnostmi závislostí v systému vlastností WPF a vyhodnocenými výrazy. Proto můžete použít DynamicResource pouze pro cíl vlastnosti závislosti. Podrobnosti najdete v tématu Rozšíření značek DynamicResource.

  • Binding poskytuje hodnotu vázanou na data pro vlastnost pomocí datového kontextu, který se vztahuje na nadřazený objekt za běhu. Toto rozšíření značek je poměrně složité, protože umožňuje podstatnou vloženou syntaxi pro zadání datové vazby. Podrobnosti najdete v tématu Rozšíření značek vazeb.

  • RelativeSource poskytuje informace o zdroji, Binding které mohou procházet několik možných relací ve stromu objektů za běhu. Poskytuje specializovaný zdroj vazeb vytvořených v šablonách s více použitími nebo vytvořených v kódu bez úplného vědomí okolního stromu objektů. Podrobnosti naleznete v tématu RelativeSource MarkupExtension.

  • TemplateBinding umožňuje šabloně ovládacího prvku použít hodnoty pro šablonované vlastnosti, které pocházejí z vlastností definovaných objektem modelem třídy, která bude šablonu používat. Jinými slovy, vlastnost v definici šablony má přístup k kontextu, který existuje pouze po použití šablony. Podrobnosti najdete v tématu Rozšíření značek TemplateBinding. Další informace o praktickém TemplateBindingpoužití naleznete v tématu Styling with ControlTemplates Sample.

  • ColorConvertedBitmap podporuje relativně pokročilý scénář vytváření obrázků. Podrobnosti najdete v tématu ColorConvertedBitmap Markup Extension.

  • ComponentResourceKey a ThemeDictionary podporují aspekty vyhledávání prostředků, zejména pro prostředky a motivy, které jsou zabalené s vlastními ovládacími prvky. Další informace naleznete v tématu ComponentResourceKey Markup Extension, ThemeDictionary Markup Extension nebo Control Authoring Overview.

*Rozšiřující třídy

Pro obecné jazyk XAML i rozšíření značek specifické pro WPF je chování každého rozšíření značek identifikováno procesoru XAML prostřednictvím *Extension třídy, která je odvozena od MarkupExtensiona poskytuje implementaci ProvideValue metody. Tato metoda pro každé rozšíření poskytuje objekt, který je vrácen při vyhodnocení rozšíření značek. Vrácený objekt se obvykle vyhodnocuje na základě různých řetězcových tokenů, které jsou předány rozšíření značek.

Třída například StaticResourceExtension poskytuje povrchovou implementaci skutečného vyhledávání prostředků tak, aby její ProvideValue implementace vrátila požadovaný objekt, se vstupem této konkrétní implementace je řetězec, který se používá k vyhledání prostředku podle jeho x:Key. Většina těchto podrobností o implementaci není důležitá, pokud používáte existující rozšíření značek.

Některá rozšíření značek nepoužívají argumenty tokenu řetězce. Je to buď proto, že vrací statickou nebo konzistentní hodnotu, nebo protože kontext pro hodnotu, kterou by se měla vrátit, je k dispozici prostřednictvím jedné ze služeb předávaných prostřednictvím parametru serviceProvider .

Vzor *Extension pojmenování je pro usnadnění a konzistenci. Není nutné, aby procesor XAML identifikoval tuto třídu jako podporu rozšíření značek. Pokud váš základ kódu zahrnuje System.Xaml a používá implementace XAML Services rozhraní .NET Framework, vše, co je nutné rozpoznat jako rozšíření kódu XAML, je odvozovat MarkupExtension a podporovat syntaxi konstrukce. WPF definuje třídy podporující rozšíření značek, které nedodržují *Extension vzor pojmenování, například Binding. Důvodem je obvykle to, že třída podporuje scénáře nad rámec podpory rozšíření čistých značek. V případě Bindingtřídy podporuje přístup za běhu k metodám a vlastnostem objektu pro scénáře, které nemají nic společného s XAML.

Interpretace inicializačního textu třídy rozšíření

Řetězcové tokeny, které následují za názvem rozšíření revizí, a stále v rámci složených závorek jsou interpretovány procesorem XAML jedním z následujících způsobů:

  • Čárka vždy představuje oddělovač nebo oddělovač jednotlivých tokenů.

  • Pokud jednotlivé oddělené tokeny neobsahují žádné znaménka rovná se, považuje se každý token za argument konstruktoru. Každý parametr konstruktoru musí být uveden jako typ očekávaný tímto podpisem a ve správném pořadí očekávaném tímto podpisem.

    Poznámka:

    Procesor XAML musí volat konstruktor, který odpovídá počtu argumentů počtu dvojic. Z tohoto důvodu pokud implementujete rozšíření vlastních značek, nezadáte více konstruktorů se stejným počtem argumentů. Chování, jak se procesor XAML chová, pokud není definována více než jedna cesta konstruktoru rozšíření značek se stejným počtem parametrů, ale měli byste předpokládat, že procesor XAML může vyvolat výjimku při použití, pokud tato situace existuje v definicích typu rozšíření značek.

  • Pokud jednotlivé oddělené tokeny obsahují znaménka rovná se, pak procesor XAML nejprve zavolá konstruktor bez parametrů pro rozšíření značek. Potom se každý pár name=value interpretuje jako název vlastnosti, který existuje v rozšíření značek, a hodnotu, která se má k této vlastnosti přiřadit.

  • Pokud existuje paralelní výsledek mezi chováním konstruktoru a chováním nastavení vlastnosti v rozšíření značek, nezáleží na tom, jaké chování použijete. Je častější použít páry hodnot vlastností=pro rozšíření značek, které mají více než jednu nastavenou vlastnost, pokud pouze proto, že je vaše revize úmyslnější a méně pravděpodobné, že omylem transponujete parametry konstruktoru. (Pokud zadáte páry property=value, mohou být tyto vlastnosti v libovolném pořadí.) Navíc neexistuje žádná záruka, že rozšíření značek poskytuje konstruktor parametr, který nastavuje každou z jeho settable vlastností. Jedná se například Binding o rozšíření značek s mnoha vlastnostmi, které jsou nastaveny prostřednictvím rozšíření ve formuláři hodnoty vlastnosti=, ale Binding podporuje pouze dva konstruktory: konstruktor bez parametrů a jeden, který nastavuje počáteční cestu.

  • Do rozšíření značek nelze předat čárku literálu bez řídicího znaku.

Řídicí sekvence a rozšíření značek

Zpracování atributů v procesoru XAML používá složené závorky jako indikátory sekvence rozšíření značek. Je také možné v případě potřeby vytvořit hodnotu atributu atributu literálu složené složené závorky zadáním řídicí sekvence pomocí prázdné dvojice složených závorek následovaných literálovou složenou složenou závorkou. Viz {} řídicí sekvence – rozšíření značek.

Vnoření rozšíření značek v použití XAML

Podporuje se vnoření více rozšíření značek a každé rozšíření značek se vyhodnotí jako první. Představte si například následující využití:

<Setter Property="Background"  
  Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />  

V tomto použití x:Static se příkaz vyhodnotí jako první a vrátí řetězec. Tento řetězec se pak použije jako argument pro DynamicResource.

Syntaxe elementů značek a rozšíření značek

Používá-li se jako objekt element, který vyplňuje hodnotu elementu vlastnosti, třída rozšíření značek je vizuálně nerozlišovatelná od typického objektu založeného na typu element, který lze použít v XAML. Praktický rozdíl mezi typickým prvkem objektu a rozšířením značek je, že rozšíření revizí je vyhodnoceno jako typová hodnota nebo odloženo jako výraz. Proto se mechanismy pro případné chyby typu hodnot vlastností pro rozšíření značek budou lišit, podobně jako způsob, jakým je vlastnost zpožděna v jiných programovacích modelech. Běžný prvek objektu bude vyhodnocen pro shodu typu s cílovou vlastností, která je nastavena při analýze XAML.

Většina rozšíření značek, pokud se používá v syntaxi elementu objektu k vyplnění elementu vlastnosti, nebude mít obsah ani žádnou další syntaxi elementu property uvnitř. Proto byste zavřeli značku elementu objektu a nezadáli žádné podřízené prvky. Pokaždé, když je v procesoru XAML zjištěn jakýkoli prvek objektu, je volána konstruktor pro tuto třídu, který vytvoří instanci objektu vytvořeného z parsovaného elementu. Třída rozšíření značek se nijak neliší: pokud chcete, aby bylo rozšíření značek použitelné v syntaxi elementu objektu, je nutné zadat konstruktor bez parametrů. Některá existující rozšíření značek mají alespoň jednu požadovanou hodnotu vlastnosti, kterou je nutné zadat pro efektivní inicializaci. Pokud ano, tato hodnota vlastnosti je obvykle uvedena jako atribut vlastnosti u elementu object. V referenčních stránkách jazykových funkcí oboru názvů XAML (x:) a rozšíření WPF XAML budou zaznamenána rozšíření značek s požadovanými vlastnostmi (a názvy požadovaných vlastností). Referenční stránky také poznamenou, pokud syntaxe elementu objektu nebo syntaxe atributu není povolena pro konkrétní rozšíření značek. Jedná se o výraz x:Array Markup Extension, který nemůže podporovat syntaxi atributu, protože obsah tohoto pole musí být zadán v rámci označování jako obsah. Obsah pole se zpracovává jako obecné objekty, proto není možné použít žádný výchozí převaděč typů pro atribut. Rozšíření značek x:Array také vyžaduje type parametr.

Viz také