Přehled rozšíření značkovacího jazyka pro XAML
Rozšíření značek jsou technikou XAML pro získání hodnoty, která není typem primitivním ani specifickým typem XAML. Pro použití atributů používají značkovací rozšíření známou posloupnost znaků otevřené složené závorky {
ke vstupu do oboru značkovacích rozšíření a zavřené složené závorky }
k jeho 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é použít podtřídu třídy MarkupExtension, definované v System.Xaml, a definovat vlastní rozšíření značek. Nebo můžete použít rozšíření značek definovaná konkrétním rámcem, pokud na něj již odkazujete.
Při přístupu k použití rozšíření značek může zapisovač objektů XAML poskytovat služby vlastní třídě MarkupExtension 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čkovacího jazyka 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é předponou x:
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í jmenného prostoru jazyka XAML v kořenovém prvku XAML dokumentu. Například projekt a šablony stránek sady Visual Studio pro různé konkrétní architektury iniciují soubor XAML pomocí tohoto mapování x:
. Ve vlastním mapování oboru názvů XAML můžete zvolit jiný token předpony, ale tato dokumentace předpokládá výchozí mapování x:
jako prostředek identifikace entit, které jsou definovanou součástí oboru názvů XAML jazyka XAML, a nikoli výchozí obor názvů XAML konkrétní architektury nebo jiné obory názvů CLR nebo XML.
x:Type
x:Type
poskytuje objekt Type pro pojmenovaný typ. Tato funkcionalita se nejčastěji používá v mechanismech odložení, které využívají základní typ CLR a odvození typu jako seskupovací označení nebo identifikátor. Příkladem jsou styly a šablony WPF a jejich použití vlastností TargetType
. Další informace viz 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 určení hodnot, které již existují jako známé konstanty v definici typu. Další informace naleznete v části 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 rámcových konceptech není null
vždy výchozí hodnotou vlastnosti nebo předpokládanou hodnotou prázdného řetězce 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í. Pro více informací viz XAML 2009 Language Features.
x:Reference
x:Reference
je součástí XAML 2009, rozšíření původní sady jazyků (2006).
x:Reference
představuje odkaz na jiný existující objekt v grafu objektu. Tento objekt je identifikován podle svého x:Name
. Další informace naleznete v tématu x:Markup Extension.
Other x: Konstrukty
Existují další konstrukty x:
, které podporují funkce jazyka XAML, ale nejsou implementovány jako rozšíření značek. Další informace naleznete v tématu Funkce 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 pro použití rozšíření značek a odpovídající nastavitelné vlastnosti.
Prostřednictvím ProvideValuemá vlastní rozšíření značek přístup ke 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. Obvykle se v cestě pro uložení jedná o XamlXmlWriter. Každý ohlášení kontext služby je jako interní XAML třída kontextu poskytovatele služeb, 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ůžete zvolit mezi dvěma možnostmi, jak pojmenovat typ podpory značkovacího rozšíření. 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í:
- Název typu pojmenujte tak, aby se přesně shodoval s tokenem pro použití XAML. Pokud chcete například podporovat použití rozšíření
{Collate ...}
, pojmenujte typ podporyCollate
. - Pojmenujte název typu jako token řetězce použití s příponou
Extension
. Pokud chcete například podporovat použití rozšíření{Collate ...}
, pojmenujte typ podporyCollateExtension
.
Pořadí vyhledávání je nejprve vyhledat název třídy s příponou Extension
a pak vyhledat název třídy bez přípony Extension
.
Z hlediska užívání značek je přípona Extension
platná jako součást použití. Chová se však, jako by Extension
skutečně byl součástí názvu třídy, a zapisovačům objektů XAML by se nepodařilo rozpoznat 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í objektového prvku je oprávněné 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, je nutné použít konstruktor bez parametrů pro podporu využití.
Vzory konstruktorů a poziční argumenty pro vlastní rozšíření značkování
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 rozšíření Collate
značek podporuje pouze režim, kdy existuje jeden poziční argument, který představuje jeho režim, zadaný jako CollationMode
výčtová konstanta. V tomto případě by měl být konstruktor s následující formou:
public Collate(CollationMode collationMode) {...}
Na základní úrovni je jejich argumentem předaným k rozšíření jazyka značek řetězec, protože se předávají z hodnot atributů jazyka značek. Můžete vytvořit všechny řetězce argumentů a pracovat se vstupem na této úrovni. K určitému zpracování, ke kterému máte přístup, však dochází před předáním argumentů rozšíření značkování do třídy podpory.
Zpracování funguje koncepčně jako když je rozšíření značek objekt, který se má vytvořit, a jeho členské hodnoty jsou pak 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ů k tomu, aby mohl být vytvořen 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 během této doby je zavolán příslušný konstruktor.
- 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 značkovacího rozšíření může také spoléhat na převodník typu, který je spojen s typem v konstrukčním argumentu.
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 {Collate AlphaUp,{x:Reference circularFile}}
využití, token AlphaUp
se odešle do prvního parametru a posuzuje se jako pojmenovaná konstanta typu výčtu CollationMode
. Výsledek vnitřního x:Reference
je odeslán do druhého parametru a je vyhodnocen 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.
Duplicitní arita pozičních argumentů
Pokud zapisovač objektu XAML zaznamená použití rozšiřující syntaxe s pozičními argumenty a existuje více argumentů konstruktoru, které tento počet argumentů přebírají (duplicitní arita), to nutně nemusí být chyba. Chování závisí na přizpůsobitelném nastavení kontextu schématu XAML SupportMarkupExtensionsWithDuplicateArity. Pokud je SupportMarkupExtensionsWithDuplicateAritytrue
, zapisovač objektu XAML by neměl vyvolat výjimku pouze z důvodu duplikované 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ídá na duplicitní kandidáty, aby určil, který podpis může být nejlepší shodou. Výjimka může být stále vyvolána, pokud žádné podpisy nemohou projít testy, které jsou vynuceny konkrétním kontextem schématu spuštěným na XAML objektovém zapisovači.
Ve výchozím nastavení je SupportMarkupExtensionsWithDuplicateArityfalse
v XamlSchemaContext založeném na CLR pro služby .NET XAML. Výchozí XamlObjectWriter proto vyvolá výjimky, pokud narazí na použití značkovacího rozšíření, kde je duplicitní arita v konstruktorech základního typu.
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ě označuje veřejnou nastavitelnou vlastnost typu podpory rozšíření značek. Pokud chcete podporovat použití pojmenovaných argumentů, měli byste poskytnout tyto veřejné nastavitelné vlastnosti. Vlastnosti mohou být zděděné, pokud zůstanou veřejné.
Přístup ke kontextu poskytovatele služeb z implementace rozšíření značkování
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 pro použití rozšíření značek jsou často navrženy tak, aby se rozšíření značek používala v kontextu atributů. Je možné také definovat podpůrnou třídu pro podporu použití prvků vlastností.
Chcete-li podporovat použití rozšíření značkovacích jazyků pro vlastnosti, 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 objektovém prvku, který zpracovává ze značek, a to zahrnuje třídy pro rozšíření značek jako objektové elementy. V pokročilých scénářích můžete definovat pro třídy jiné než výchozí cesty pro konstrukce. (Další informace najdete 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 udávají zamýšlené využití značkovacího rozšíření.
MarkupExtensionReturnTypeAttribute hlásí informace o Type pro typ objektu, který ProvideValue vrátí. Podle svého čistého podpisu vrátí ProvideValueObject. Ale různí spotřebitelé můžou chtít přesnější informace o typu návratu. To zahrnuje:
- Návrháři a IDE, kteří by mohli být schopni poskytnout podporu s ohledem na typy pro použití rozšíření značek.
- Pokročilé implementace obslužných rutin
SetMarkupExtension
v cílových třídách se mohou spoléhat na reflexi pro určení návratového typu rozšíření značkování, namísto větvení na specifické a známé implementace MarkupExtension podle názvu.
Serializace využití rozšíření značkovacího jazyka
Když zapisovač objektu XAML zpracovává použití rozšíření značek a volá ProvideValue, kontext předchozího použití rozšíření značek se zachovává ve streamu uzlů XAML, ale ne v objektovém grafu. 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 v serializovaném výstupu, musíte navrhnout vlastní infrastrukturu pro sledování využití rozšíření značek z proudu uzlů XAML načítacího toku. Můžete implementovat chování pro opětovné vytvoření prvků toku uzlů z cesty načítání a přehrát je zpět do zapisovačů XAML pro serializaci na cestě uložení a nahradit hodnotu v příslušné pozici toku uzlu.
Rozšíření značek v uzlovém streamu XAML
Pokud pracujete s proudem uzlů XAML v načítací cestě, použití značkovacího rozšíření se objeví v proudu uzlů jako objekt.
Pokud použití rozšíření značkovacího jazyka používá poziční argumenty, je reprezentováno 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 obsahuje poziční argumenty jako řetězec, zahrnující všechny oddělovače mezi nimi)
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šiřující značky vyžaduje kontext schématu XAML, protože to vyžaduje mapování typů a vytvoření instance podpory pro rozšiřující značku. Toto je jeden z důvodů, proč se využití rozšíření značkování tímto způsobem zachovává ve výchozích proudech uzlů služby .NET XAML – část načítací cesty čtečky často nemá k dispozici potřebný kontext XAML schématu.
Pokud pracujete s datovým proudem uzlů XAML při ukládání, v reprezentaci objektového grafu obecně není nic, co by vás upozornilo na to, že objekt k serializaci byl původně poskytnut použitím rozšíření značek a výsledkem ProvideValue
. Scénáře, které potřebují zachovat použití rozšiřujících značek pro obousměrný proces a zároveň zachytit další změny v grafu objektů, musí navrhnout vlastní techniky pro uchování znalostí o použití rozšiřujících 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é
.NET Desktop feedback