Přehled rozšíření značek pro XAML

Rozšíření značek jsou technika XAML pro získání hodnoty, která není primitivním nebo konkrétním typem XAML. Pro použití atributu rozšíření značek používají známou znakovou sekvenci otevřené složené závorky pro zadání oboru rozšíření značek a pravou složenou složenou závorku {} pro ukončení. Při použití služeb .NET XAML můžete použít některé z předdefinovaných rozšíření značek jazyka XAML ze sestavení System.Xaml. Můžete také podtřídu MarkupExtension z třídy definované v System.Xaml a definovat vlastní rozšíření značek. Nebo můžete použít rozšíření značek definovaná konkrétní architekturou, pokud na tuto architekturu už odkazujete.

Při přístupu k použití rozšíření značek může zapisovač objektů XAML poskytovat služby vlastní MarkupExtension třídě prostřednictvím spojovacího bodu služby v přepsání MarkupExtension.ProvideValue . Služby lze použít k získání kontextu o využití, konkrétních funkcích zapisovače objektů, kontextu schématu XAML atd.

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

Služba .NET XAML Services implementuje několik rozšíření značek pro podporu jazyka XAML. Tato rozšíření značek odpovídají částem specifikace XAML jako jazyka. Ty jsou obvykle identifikovatelné x: předponou v syntaxi, jak je vidět v běžném použití. Implementace služeb .NET XAML pro tyto elementy jazyka XAML jsou odvozeny od MarkupExtension základní třídy.

Poznámka:

Předpona x: se používá pro typické mapování oboru názvů XAML oboru názvů jazyka XAML v kořenovém prvku produkčního prostředí XAML. Například projekt a šablony stránek sady Visual Studio pro různé konkrétní architektury 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 jazyka XAML, na rozdíl od výchozího oboru názvů XAML konkrétní architektury nebo jiného oboru názvů CLR nebo XML.

x:Type

x:TypeType poskytuje objekt pro pojmenovaný typ. Tato funkce se nejčastěji používá v mechanismech odložení, které používají základní typ CLR a odvození typu jako seskupovací moniker nebo identifikátor. Příkladem jsou styly a šablony WPF a jejich použití TargetType vlastností. Další informace naleznete v tématu x:Type Markup Extension.

x:Static

x:Static vytvoří statické hodnoty z entit kódu typu hodnota, které nejsou přímo typem hodnoty vlastnosti, ale lze je vyhodnotit na tento typ. To je užitečné pro zadání hodnot, které již existují, stejně známé konstanty v definici typu. Další informace naleznete v tématu x:Static Markup Extension.

x:Null

x:Null určuje null jako hodnotu člena XAML. V závislosti na návrhu konkrétních typů nebo na větších konceptech null architektury není vždy výchozí hodnota vlastnosti nebo implicitní hodnota prázdného řetězcového atributu. Další informace naleznete v tématu x:Null Markup Extension.

x:Array

x:Array podporuje vytváření obecných polí v syntaxi XAML v případech, kdy se záměrně nepoužívá podpora kolekce poskytovaná základními prvky a řídicími modely. Další informace naleznete v tématu x:Array Markup Extension. Konkrétně v XAML 2009 jsou pole přístupná jako primitiva jazyka místo jako rozšíření. Další informace najdete v tématu Funkce jazyka XAML 2009.

x:Reference

x:Reference je součástí XAML 2009, rozšíření původní sady jazyka (2006). x:Reference představuje odkaz na jiný existující objekt v grafu objektu. Tento objekt je identifikován jeho x:Name. Další informace naleznete v tématu x:Reference Markup Extension.

Other x: Constructs

Existují i jiné x: konstrukty podporující funkce jazyka XAML, ale nejsou implementovány jako rozšíření značek. Další informace najdete v tématu Jazykové funkce oboru názvů jazyka XAML (x:).

MarkupExtension – základní třída

Chcete-li definovat vlastní rozšíření značek, které může pracovat s výchozími implementacemi čteček XAML a zapisovačů XAML v System.Xaml, odvozujete třídu z abstraktní MarkupExtension třídy. Tato třída má jednu metodu přepsání, což je ProvideValue. Možná budete také muset definovat další konstruktory, které podporují argumenty použití rozšíření značek a odpovídající vlastnosti settable.

Prostřednictvím ProvideValuerozšíření vlastních značek má přístup k kontextu služby, který hlásí prostředí, ve kterém je rozšíření značek vyvoláno procesorem XAML. V cestě načítání je to obvykle XamlObjectWriter. V cestě pro uložení je to obvykle .XamlXmlWriter Každá sestava kontextu služby jako interní třída kontextu poskytovatele služeb XAML, která implementuje vzor poskytovatele služeb. Další informace o dostupných službách a jejich reprezentaci naleznete v tématu Převaděče typů a rozšíření značek pro XAML.

Vaše třída rozšíření značek musí používat úroveň veřejného přístupu; Procesory XAML musí být vždy schopné vytvořit instanci třídy podpory rozšíření značek, aby bylo možné používat své služby.

Definování typu podpory pro rozšíření vlastních značek

Pokud používáte .NET XAML Services nebo architektury, které jsou založeny na .NET XAML Services, máte dvě možnosti, jak pojmenovat typ podpory rozšíření značek. Název typu je relevantní pro to, jak se zapisovači objektů XAML pokusí získat přístup k typu podpory rozšíření značek a vyvolat ho, když v XAML narazí na použití rozšíření značek. Použijte jednu z následujících strategií pojmenování:

  • Pojmenujte název typu, který se přesně shoduje s tokenem použití značek XAML. Chcete-li například podporovat {Collate ...} použití rozšíření, pojmenujte typ Collatepodpory .
  • Pojmenujte název typu jako token řetězce použití a příponu Extension. Chcete-li například podporovat {Collate ...} použití rozšíření, pojmenujte typ CollateExtensionpodpory .

Pořadí vyhledávání je nejprve vyhledat Extensionnázev třídy -suffixed a pak vyhledat název třídy bez přípony Extension .

Z hlediska použití značek, včetně přípony Extension jako součásti použití, je platná. Toto chování se však chová, jako by Extension byl skutečně součástí názvu třídy, a zapisovače objektů XAML by se nepodařilo přeložit třídu podpory rozšíření značek pro toto použití, pokud třída podpory neměla příponu Extension .

Konstruktor bez parametrů

Pro všechny typy podpory rozšíření značek byste měli zveřejnit veřejný konstruktor bez parametrů. Konstruktor bez parametrů se vyžaduje pro případ, kdy zapisovač objektu XAML vytvoří instanci rozšíření značek z použití elementu objektu. Podpora použití elementu objektu je spravedlivé očekávání pro rozšíření značek, zejména pro serializaci. Rozšíření značek však můžete implementovat bez veřejného konstruktoru, pokud chcete podporovat pouze použití atributů rozšíření značek.

Pokud využití rozšíření značek neobsahuje žádné argumenty, konstruktor bez parametrů je nutný k podpoře využití.

Vzory konstruktoru a poziční argumenty pro rozšíření vlastních značek

Pro rozšíření značek s zamýšleným použitím argumentů musí veřejné konstruktory odpovídat režimům zamýšleného použití. Jinými slovy, pokud je rozšíření značek navržené tak, aby jako platné použití vyžadovalo jeden poziční argument, měli byste podporovat veřejný konstruktor s jedním vstupním parametrem, který přebírá poziční argument.

Předpokládejme například, že Collate rozšíření značek má podporovat pouze režim, ve kterém je jeden poziční argument, který představuje jeho režim určený jako konstanta CollationMode výčtu. V tomto případě by měl být konstruktor s následujícím formulářem:

public Collate(CollationMode collationMode) {...}

Na základní úrovni jsou argumenty předané rozšíření značek řetězec, protože se předávají z hodnot atributů značek. Můžete vytvořit všechny řetězce argumentů a pracovat se vstupem na této úrovni. Máte však přístup k určitému zpracování, ke kterému dochází před předáním argumentů rozšíření značek do třídy podpory.

Zpracování funguje koncepčně jako v případě, že rozšíření značek je objekt, který se má vytvořit, a jeho členské hodnoty jsou nastaveny. Každá zadaná vlastnost, která se má nastavit, se vyhodnocuje podobně jako u vytvořeného objektu při analýze XAML. Existují dva důležité rozdíly:

  • Jak jsme uvedli dříve, typ podpory rozšíření značek nemusí mít konstruktor bez parametrů, aby bylo možné vytvořit instanci v XAML. Jeho konstrukce objektu je odložena, dokud nebudou jeho možné argumenty v textové syntaxi tokenizovány a vyhodnoceny jako poziční nebo pojmenované argumenty a příslušný konstruktor se v té době volá.
  • Využití rozšíření značek je možné vnořit. Nejvnitřnější rozšíření značek se vyhodnocuje jako první. Proto můžete předpokládat takové použití a deklarovat jeden z parametrů konstrukce jako typ, který k vytvoření vyžaduje převaděč hodnot (například rozšíření značek).

V předchozím příkladu bylo znázorněno spoléhání na takové zpracování. Zapisovač objektů XAML služby .NET XAML zpracovává názvy konstant výčtu do výčtových hodnot na nativní úrovni.

Zpracování textové syntaxe pozičního parametru rozšíření značek může také spoléhat na převaděč typů, který je přidružen k typu, který je v argumentu konstrukce.

Argumenty se nazývají poziční argumenty, protože pořadí, ve kterém jsou tokeny ve využití zjištěny, odpovídá pořadí pozice parametru konstruktoru, ke kterému jsou přiřazeny. Představte si například následující podpis konstruktoru:

public Collate(CollationMode collationMode, object collateThis) {...}

Procesor XAML očekává pro toto rozšíření značek dva poziční argumenty. Pokud došlo k použití {Collate AlphaUp,{x:Reference circularFile}}, AlphaUp token se odešle do prvního parametru a vyhodnotí se jako CollationMode výčet pojmenované konstanty. Výsledek vnitřní x:Reference se odešle do druhého parametru a vyhodnotí se jako objekt.

V zadaných pravidlech XAML pro syntaxi rozšíření značek a zpracování je čárka oddělovačem mezi argumenty, ať už jsou tyto argumenty pozičními nebo pojmenovanými argumenty.

Duplikování zápisu pozičních argumentů

Pokud zapisovač objektu XAML zaznamená použití rozšíření značek s pozičními argumenty a existuje více argumentů konstruktoru, které tento počet argumentů přebírají (duplicitní arity), to nemusí nutně být chyba. Chování závisí na přizpůsobitelném nastavení kontextu schématu XAML. SupportMarkupExtensionsWithDuplicateArity Pokud SupportMarkupExtensionsWithDuplicateArity ano true, zapisovač objektu XAML by neměl vyvolat výjimku pouze z důvodů duplikování arity. Chování nad rámec tohoto bodu není přísně definováno. Základním předpokladem návrhu je, že kontext schématu má k dispozici informace o typu pro konkrétní parametry a může se pokusit o explicitní přetypování, které odpovídají duplicitním kandidátům, aby viděl, který podpis může být nejlepší shody. Výjimka může být stále vyvolán, pokud žádné podpisy nemohou projít testy, které jsou vynuceny konkrétním kontextem schématu spuštěným na zapisovači objektů XAML.

Ve výchozím nastavení SupportMarkupExtensionsWithDuplicateArity je false v modulu CLR pro XamlSchemaContext služby .NET XAML. Proto výchozí XamlObjectWriter vyvolá výjimky, pokud narazí na použití rozšíření značek, kde je duplicitní arity v záložních typech konstruktorů.

Pojmenované argumenty pro rozšíření vlastních značek

Rozšíření značek zadaná jazykem XAML mohou také použít pojmenovaný formulář argumentů pro použití. Na první úrovni tokenizace je syntaxe textu rozdělena na argumenty. Přítomnost znaménka rovná se (=) v libovolném argumentu identifikuje argument jako pojmenovaný argument. Takový argument je také tokenizován do páru název/hodnota. Název v tomto případě pojmenuje veřejnou nastavenou vlastnost typu podpory rozšíření značek. Pokud máte v úmyslu podporovat použití pojmenovaných argumentů, měli byste zadat tyto veřejné settable vlastnosti. Vlastnosti mohou být zděděné, pokud zůstanou veřejné.

Přístup k kontextu zprostředkovatele služeb z implementace rozšíření značek

Dostupné služby jsou stejné pro jakýkoli převaděč hodnot. Rozdíl je v tom, jak každý převaděč hodnot přijímá kontext služby. Přístup ke službám a dostupným službám jsou popsané v tématu Převaděče typů a rozšíření značek pro XAML.

Použití elementu vlastnosti rozšíření značek

Scénáře použití rozšíření značek jsou často navrženy tak, aby používaly rozšíření značek v použití atributů. Je však také možné definovat backing třídu pro podporu použití elementů vlastností.

Chcete-li podporovat použití elementu vlastnosti rozšíření značek, definujte veřejný konstruktor bez parametrů. To by měl být konstruktor instance, nikoli statický konstruktor. To je povinné, protože procesor XAML musí obecně vyvolat konstruktor bez parametrů na libovolném prvku objektu, který zpracovává z revize, a to zahrnuje třídy rozšíření značek jako objektové prvky. V pokročilých scénářích můžete definovat pro třídy jiné než výchozí cesty pro konstrukce. (Další informace naleznete v tématu x:FactoryMethod – direktiva.) Tyto vzory byste ale neměli používat pro účely rozšíření značek, protože zjišťování vzoru použití je mnohem obtížnější, a to jak pro návrháře, tak pro uživatele nezpracovaných značek.

Přiřazení vlastního rozšíření značek

Pokud chcete podporovat prostředí návrhu i určité scénáře zapisování objektů XAML, měli byste přiřadit typ podpory rozšíření značek s několika atributy CLR. Tyto atributy hlásí zamýšlené využití rozšíření značek.

MarkupExtensionReturnTypeAttributeType hlásí informace o typu objektu, který ProvideValue vrací. Jeho čistý podpis vrátí ProvideValueObject. Různí spotřebitelé ale můžou chtít přesnější informace o návratu typu. Sem patří:

  • Návrháři a prostředí IDE, kteří můžou být schopni poskytnout podporu pro použití rozšíření značek s podporou typů.
  • Pokročilé implementace obslužných rutin v cílových SetMarkupExtension třídách, které se můžou spoléhat na reflexi k určení návratového typu rozšíření značek místo větvení na konkrétní známé MarkupExtension implementace podle názvu.

Serializace využití rozšíření značek

Když zapisovač objektu XAML zpracuje použití rozšíření značek a zavolá ProvideValue, kontext pro něj dříve je použití rozšíření značek trvalé ve streamu uzlu XAML, ale ne v grafu objektu. V grafu objektu je zachována pouze hodnota. Pokud máte scénáře návrhu nebo jiné důvody pro zachování původního použití rozšíření značek do serializovaného výstupu, musíte navrhnout vlastní infrastrukturu pro sledování využití rozšíření značek z streamu uzlu XAML cesty načtení. Můžete implementovat chování pro opětovné vytvoření elementů datového proudu uzlu z cesty načtení a přehrát je zpět do zapisovačů XAML pro serializaci v cestě pro uložení a nahradit hodnotu v příslušné pozici streamu uzlu.

Rozšíření značek ve streamu uzlu XAML

Pokud pracujete s streamem uzlu XAML na cestě k načtení, zobrazí se ve streamu uzlu jako objekt použití rozšíření značek.

Pokud použití rozšíření značek používá poziční argumenty, je reprezentován jako počáteční objekt s inicializační hodnotou. Jako hrubá textová reprezentace se datový proud uzlu podobá následujícímu:

StartObject (XamlType je typ definice rozšíření značek, nikoli jeho návratový typ)

StartMember (název XamlMember je _InitializationText)

Value (hodnota je poziční argumenty jako řetězec, včetně intervenujících oddělovačů)

EndMember

EndObject

Použití rozšíření značek s pojmenovanými argumenty je reprezentováno jako objekt se členy relevantních názvů, z nichž každá je nastavena s hodnotami textového řetězce.

Ve skutečnosti vyvolání ProvideValue implementace rozšíření značek vyžaduje kontext schématu XAML, protože vyžaduje mapování typů a vytvoření rozšíření značek podporuje typ instance. To je jedním z důvodů, proč se využití rozšíření značek tímto způsobem zachová ve výchozích datových proudech uzlů .NET XAML Services – část načtení cesty čtenáře často nemá k dispozici potřebný kontext schématu XAML.

Pokud pracujete s datovým proudem uzlu XAML na cestě pro uložení, v reprezentaci objektového grafu obecně neexistuje nic, co by vás informovalo o tom, že objekt k serializaci byl původně poskytnut použitím rozšíření značek a ProvideValue výsledkem. Scénáře, které potřebují zachovat využití rozšíření značek pro odezvu a zároveň zachytit další změny v grafu objektů, musí navrhnout vlastní techniky pro zachování znalostí o využití rozšíření značek z původního vstupu XAML. Pokud například chcete obnovit využití rozšíření značek, možná budete muset pracovat s datovým proudem uzlu na cestě pro uložení, abyste obnovili využití rozšíření značek, nebo proveďte nějaký typ sloučení mezi původním XAML a zaokrouhleným XAML. Některé architektury implementující XAML, jako je WPF, používají zprostředkující typy (výrazy) k reprezentaci případů, kdy využití rozšíření značek poskytlo hodnoty.

Viz také