Podrobná syntaxe XAML
Toto téma definuje termíny, které se používají k popisu prvků syntaxe XAML. Tyto termíny se často používají ve zbývající části této dokumentace, a to jak pro dokumentaci WPF, tak pro ostatní architektury, které používají XAML nebo základní koncepty XAML povolené podporou jazyka XAML na úrovni System.Xaml. Toto téma se zaměřuje na základní terminologii představenou v tématu XAML ve WPF.
Specifikace jazyka XAML
Zde definovaná terminologie syntaxe XAML je také definována nebo odkazována ve specifikaci jazyka XAML. XAML je jazyk založený na jazyce XML a následuje nebo rozšiřuje strukturální pravidla XML. Některá terminologie se sdílí nebo je založená na terminologii, která se běžně používá při popisu jazyka XML nebo objektového modelu dokumentu XML.
Další informace o specifikaci jazyka XAML si můžete stáhnout [MS-XAML] z webu Microsoft Download Center.
XAML a CLR
XAML je jazyk revizí. Modul CLR (Common Language Runtime), jak vyplývá z názvu, umožňuje spouštění modulu runtime. XAML není sám o sobě jedním z běžných jazyků, které přímo využívá modul runtime CLR. Místo toho si xaml můžete představit jako podporu vlastního systému typů. Konkrétní systém analýzy XAML, který používá WPF, je založen na CLR a systému typů CLR. Typy XAML se mapují na typy CLR, aby se při analýze XAML pro WPF vytvořila instance reprezentace doby běhu. Z tohoto důvodu bude zbytek diskuze o syntaxi v tomto dokumentu zahrnovat odkazy na systém typů CLR, i když ekvivalentní diskuze syntaxe ve specifikaci jazyka XAML ne. (Na úrovni specifikace jazyka XAML je možné namapovat typy XAML na jakýkoli jiný systém typů, který nemusí být CLR, ale to by vyžadovalo vytvoření a použití jiného analyzátoru XAML.)
Členy typů a dědičnosti tříd
Vlastnosti a události, jak se zobrazují jako členové XAML typu WPF, se často dědí ze základních typů. Představte si například tento příklad: <Button Background="Blue" .../>
. Vlastnost Background není okamžitě deklarovanou vlastností třídy Button , pokud byste se podívali na definici třídy, výsledky reflexe nebo dokumentaci. Background Místo toho se dědí ze základní Control třídy.
Chování dědičnosti tříd elementů WPF XAML je významným odchodem ze schématu vynucené interpretace kódu XML. Dědičnost tříd může být složitá, zejména pokud jsou mezisoustavní základní třídy abstraktní nebo když jsou zahrnuta rozhraní. To je jeden z důvodů, proč je obtížné přesně a zcela znázorňovat sadu elementů XAML a jejich přípustné atributy pomocí typů schémat, které se obvykle používají pro programování XML, jako je formát DTD nebo XSD. Dalším důvodem je, že rozšiřitelnost a funkce mapování typů samotného jazyka XAML brání úplnosti jakéhokoli pevného vyjádření povolených typů a členů.
Syntaxe elementu object
Syntaxe elementu objektu je syntaxe značek XAML, která vytváří instanci třídy nebo struktury CLR deklarováním elementu XML. Tato syntaxe se podobá syntaxi elementu jiných značek jazyků, jako je HTML. Syntaxe elementu objektu začíná levou úhlovou závorkou (<), za kterou bezprostředně následuje název typu třídy nebo struktury, která se vytvoří instance. Název typu může následovat nula nebo více mezer a u elementu objektu mohou být deklarovány také nula nebo více atributů, přičemž jeden nebo více mezer odděluje každý pár name="value". Nakonec musí být splněna jedna z následujících podmínek:
Prvek a značka musí být uzavřeny lomítkem (/) a bezprostředně za ním pravá hranatá závorka (>).
Levá značka musí být dokončena pravou závorkou (>). Ostatní prvky objektu, prvky vlastností nebo vnitřní text mohou následovat za počáteční značkou. Přesně to, jaký obsah může být zde obsažen, je obvykle omezen objektový model prvku. Ekvivalentní uzavírací značka pro prvek objektu musí existovat také ve správném vnoření a vyvážení s jinými dvojicemi levých a pravých značek.
XAML implementovaný rozhraním .NET obsahuje sadu pravidel, která mapují elementy objektů na typy, atributy do vlastností nebo událostí a obory názvů XAML na obory názvů CLR a sestavení. V případě WPF a .NET se elementy objektu XAML mapují na typy .NET definované v odkazovaných sestaveních a atributy mapují na členy těchto typů. Při odkazování na typ CLR v XAML máte také přístup k zděděným členům tohoto typu.
Například následující příklad je syntaxe elementu objektu, která vytvoří instanci nové instance Button třídy a také určuje Name atribut a hodnotu pro tento atribut:
<Button Name="CheckoutButton"/>
Následující příklad je syntaxe elementu objektu, která zahrnuje také syntaxi vlastnosti obsahu XAML. Vnitřní text obsažený uvnitř se použije k nastavení TextBox vlastnosti obsahu XAML, Text.
<TextBox>This is a Text Box</TextBox>
Modely obsahu
Třída může podporovat použití jako prvek objektu XAML z hlediska syntaxe, ale tento prvek bude fungovat správně pouze v aplikaci nebo stránce, když je umístěn v očekávané pozici celkové kon režim stanu l nebo stromu prvků. Například MenuItem by měl být obvykle umístěn pouze jako podřízený odvozené MenuBase třídy, například Menu. Con režim stanu ls for specific elements are documented as part of the poznámky on the class pages for controls and other WPF classes that can be used as XAML elements.
Vlastnosti elementů objektu
Vlastnosti v JAZYCE XAML jsou nastaveny různými možnými syntaxemi. Jakou syntaxi lze použít pro konkrétní vlastnost, se bude lišit v závislosti na charakteristikách systému základního typu vlastnosti, kterou nastavujete.
Nastavením hodnot vlastností přidáte do objektů funkce nebo charakteristiky, které existují v grafu objektů za běhu. Počáteční stav vytvořeného objektu z elementu objektu je založen na chování konstruktoru bez parametrů. Vaše aplikace obvykle použije něco jiného, než je zcela výchozí instance jakéhokoli daného objektu.
Syntaxe atributu (vlastnosti)
Syntaxe atributu je syntaxe kódu XAML, která nastavuje hodnotu vlastnosti deklarováním atributu u existujícího elementu objektu. Název atributu se musí shodovat s názvem člena CLR vlastnosti třídy, která backs the relevant object element. Za názvem atributu následuje operátor přiřazení (=). Hodnota atributu musí být řetězec uzavřený v uvozovkách.
Poznámka:
Pomocí střídavých uvozovek můžete do atributu umístit literálovou uvozovku. Můžete například použít jednoduché uvozovky jako prostředek k deklarování řetězce, který obsahuje znak dvojité uvozovky. Bez ohledu na to, jestli používáte jednoduché nebo dvojité uvozovky, byste měli použít odpovídající dvojici pro otevření a uzavření řetězce hodnoty atributu. K dispozici jsou také řídicí sekvence nebo jiné techniky pro práci s omezeními znaků uloženými konkrétní syntaxí XAML. Viz entity znaků XML a XAML.
Aby bylo možné nastavit syntaxi atributu, musí být vlastnost veřejná a musí být zapisovatelná. Hodnota vlastnosti v systému záložního typu musí být typ hodnoty nebo musí být referenčním typem, na který může vytvořit instanci nebo odkazovat procesor XAML při přístupu k příslušnému typu backingu.
U událostí WPF XAML musí být událost odkazovaná jako název atributu veřejná a mít veřejný delegát.
Vlastnost nebo událost musí být členem třídy nebo struktury, která je vytvořena pomocí objektu obsahující prvek.
Zpracování hodnot atributů
Řetězcová hodnota obsažená v levých a uvozovkách je zpracována procesorem XAML. U vlastností je výchozí chování zpracování určeno typem základní vlastnosti CLR.
Hodnota atributu je vyplněna jednou z následujících hodnot pomocí tohoto pořadí zpracování:
Pokud procesor XAML narazí na složenou závorku nebo objektový prvek, který je odvozen od MarkupExtension, pak odkazované rozšíření značek se vyhodnotí jako první místo zpracování hodnoty jako řetězec a objekt vrácený rozšířením značek se použije jako hodnota. V mnoha případech bude objekt vrácen rozšířením značek odkazem na existující objekt nebo výraz, který odvrací vyhodnocení do doby běhu a není nově vytvořeným objektem.
Pokud je vlastnost deklarována s atributem TypeConverter, nebo typ hodnoty této vlastnosti je deklarován s atributem TypeConverter, řetězcová hodnota atributu je odeslána do převaděče typů jako vstup převodu a převaděč vrátí novou instanci objektu.
Pokud neexistuje, TypeConverterpokusí se o přímý převod na typ vlastnosti. Tato konečná úroveň je přímým převodem na nativní hodnotu analyzátoru mezi primitivními typy jazyka XAML nebo kontrolou názvů pojmenovaných konstant ve výčtu (analyzátor pak přistupuje ke shodným hodnotám).
Hodnoty atributů výčtu
Výčty v jazyce XAML se zpracovávají vnitřně analyzátory XAML a členy výčtu by měly být určeny zadáním názvu řetězce jedné z pojmenovaných konstant výčtu.
U hodnot výčtu jiného typu je nativní chování zpracovat řetězec hodnoty atributu a přeložit ho na jednu z hodnot výčtu. Nezadáte výčet ve formátu výčtu.Hodnota, jak to uděláte v kódu. Místo toho zadáte pouze hodnotu a výčet je odvozen podle typu vlastnosti, kterou nastavujete. Pokud v výčtu zadáte atribut.Formulář hodnoty se nepřeloží správně.
Pro výčty příznakem je chování založeno na Enum.Parse metodě. Více hodnot pro výčty příznakem můžete zadat tak, že každou hodnotu oddělíte čárkou. Nelze však kombinovat hodnoty výčtu, které nejsou označeny příznakem. Například nelze použít syntaxi čárky k pokusu o Trigger vytvoření, který funguje na více podmínek výčtu nonflag:
<!--This will not compile, because Visibility is not a flagwise enumeration.-->
...
<Trigger Property="Visibility" Value="Collapsed,Hidden">
<Setter ... />
</Trigger>
...
Výčty s příznakem, které podporují atributy, které jsou nastavené v XAML, jsou ve WPF vzácné. Jedním z těchto výčtů je StyleSimulationsvšak . Můžete například použít syntaxi atributů oddělených čárkami k úpravě příkladu uvedeného v poznámkách pro Glyphs třídu; StyleSimulations = "BoldSimulation"
může se stát StyleSimulations = "BoldSimulation,ItalicSimulation"
. KeyBinding.Modifiers je další vlastnost, kde lze zadat více než jednu hodnotu výčtu. Tato vlastnost však může být zvláštní případ, protože ModifierKeys výčet podporuje vlastní typ převaděče. Převaděč typů modifikátorů používá znaménko plus (+) jako oddělovač místo čárky (,). Tento převod podporuje tradiční syntaxi, která představuje kombinace kláves v programování systému Microsoft Windows, například Ctrl+Alt.
Vlastnosti a odkazy na název člena události
Při zadávání atributu můžete odkazovat na libovolnou vlastnost nebo událost, která existuje jako člen typu CLR, který jste vytvořili instanci pro obsahující prvek objektu.
Nebo můžete odkazovat na připojenou vlastnost nebo připojenou událost nezávisle na obsahujícím elementu objektu. (Připojené vlastnosti jsou popsány v nadcházející části.)
Můžete také pojmenovat jakoukoli událost z libovolného objektu, který je přístupný prostřednictvím výchozího oboru názvů pomocí typeName.částečně kvalifikovaný název události ; tato syntaxe podporuje připojení obslužných rutin pro směrované události, kde je obslužná rutina určena ke zpracování událostí směrování z podřízených prvků, ale nadřazený prvek nemá tuto událost také v tabulce členů. Tato syntaxe se podobá syntaxi připojené události, ale tato událost není skutečnou připojenou událostí. Místo toho odkazujete na událost s kvalifikovaným názvem. Další informace najdete v přehledu směrovaných událostí.
V některých scénářích se názvy vlastností někdy zadají jako hodnota atributu, nikoli jako název atributu. Tento název vlastnosti může také obsahovat kvalifikátory, například vlastnost zadanou ve formuláři ownerType.dependencyPropertyName. Tento scénář je běžný při psaní stylů nebo šablon v XAML. Pravidla zpracování názvů vlastností zadaných jako hodnota atributu se liší a řídí se typem vlastnosti, která je nastavena, nebo chováním konkrétních subsystémů WPF. Podrobnosti najdete v tématu Styling a Šablonování.
Dalším použitím názvů vlastností je, když hodnota atributu popisuje relaci vlastností. Tato funkce se používá pro datové vazby a pro cíle scénáře a je povolena PropertyPath třídou a jeho převaděčem typů. Podrobnější popis sémantiky vyhledávání naleznete v tématu Syntaxe XAML PropertyPath.
Syntaxe elementu vlastnosti
Syntaxe elementu vlastnosti je syntaxe , která se mírně liší od základních pravidel syntaxe XML pro elementy. V jazyce XML je hodnota atributu de facto řetězec, přičemž jedinou možnou variantou, kterou formát kódování řetězců používá. V jazyce XAML můžete přiřadit další prvky objektu, které mají být hodnotou vlastnosti. Tato funkce je povolena syntaxí elementu vlastnosti. Místo vlastnosti, která je zadána jako atribut uvnitř značky elementu, je vlastnost určena pomocí počáteční značky elementu v elementTypeName.propertyName form, hodnota vlastnosti je zadána uvnitř a poté property element je uzavřen.
Konkrétně syntaxe začíná levou úhlovou závorkou (<), za kterou bezprostředně následuje název typu třídy nebo struktury, ve které je syntaxe prvku vlastnosti obsažena. Následuje okamžitě jedna tečka (.), pak názvem vlastnosti a potom pravou hranatým závorkou (>). Stejně jako u syntaxe atributu musí tato vlastnost existovat v rámci deklarovaných veřejných členů zadaného typu. Hodnota, která má být přiřazena k vlastnosti je obsažena v elementu property. Obvykle je hodnota uvedena jako jeden nebo více prvků objektu, protože určení objektů jako hodnot je scénář, že syntaxe elementu vlastnosti je určena k vyřešení. Nakonec ekvivalentní koncová značka určující stejný elementTypeName.Musí být k dispozici kombinace propertyName ve správném vnoření a vyvážení s jinými značkami elementů.
Například následující je syntaxe elementu vlastnosti pro ContextMenu vlastnost Button.
<Button>
<Button.ContextMenu>
<ContextMenu>
<MenuItem Header="1">First item</MenuItem>
<MenuItem Header="2">Second item</MenuItem>
</ContextMenu>
</Button.ContextMenu>
Right-click me!</Button>
Hodnotu v elementu vlastnosti lze také zadat jako vnitřní text, v případech, kdy zadaný typ vlastnosti je primitivní typ hodnoty, například String, nebo výčtu, kde je zadán název. Tyto dvě použití jsou poněkud neobvyklé, protože každý z těchto případů může také použít jednodušší syntaxi atributů. Jedním ze scénářů pro vyplnění elementu vlastnosti řetězcem je pro vlastnosti, které nejsou vlastností obsahu XAML, ale stále se používají pro reprezentaci textu uživatelského rozhraní a konkrétní prázdné prvky, jako jsou například řádkové kanály, se musí zobrazit v tomto textu uživatelského rozhraní. Syntaxe atributu nemůže zachovat hodnoty linefeeds, ale syntaxe elementu vlastnosti může, pokud je důležitá zachování prázdných znaků aktivní (podrobnosti najdete v tématu Zpracování prázdných znaků v jazyce XAML). Dalším scénářem je, aby bylo možné použít direktivu x:Uid na prvek vlastnosti a označit hodnotu jako hodnotu, která by měla být lokalizována ve výstupu WPF BAML nebo jinými technikami.
Prvek vlastnosti není reprezentován v logickém stromu WPF. Prvek vlastnosti je pouze konkrétní syntaxe pro nastavení vlastnosti a není element, který má instanci nebo objekt, který jej zálohuje. (Podrobnosti o konceptu logického stromu najdete v tématu Stromy ve WPF.)
U vlastností, ve kterých jsou podporovány syntaxe atributů i elementů vlastností, mají tyto dvě syntaxe obecně stejný výsledek, i když se drobné odlišnosti, jako je zpracování prázdných znaků, může mírně lišit mezi syntaxemi.
Syntaxe kolekce
Specifikace XAML vyžaduje implementace procesoru XAML k identifikaci vlastností, ve kterých je typ hodnoty kolekce. Obecná implementace procesoru XAML v .NET je založená na spravovaném kódu a CLR a identifikuje typy kolekcí prostřednictvím jednoho z následujících způsobů:
Typ implementuje IList.
Typ implementuje IDictionary.
Typ je odvozen od Array (další informace o polích v XAML, viz x:Array Markup Extension.)
Pokud je typem vlastnosti kolekce, odvozený typ kolekce nemusí být zadán v kódu jako objekt elementu. Místo toho jsou prvky, které jsou určeny k tomu, aby se staly položkami v kolekci, zadány jako jeden nebo více podřízených prvků prvku vlastnosti. Každá taková položka se vyhodnotí jako objekt během načítání a přidána do kolekce voláním Add
metody implicitní kolekce. Triggers Například vlastnost Style přebírá specializovaný typ TriggerCollectionkolekce , který implementuje IList. Není nutné vytvořit instanci TriggerCollection prvku objektu v revizí. Místo toho zadáte jednu nebo více Trigger položek jako prvky v elementu Style.Triggers
vlastnosti, kde Trigger (nebo odvozená třída) je typ očekávaný jako typ položky pro silně typ typ a implicitní TriggerCollection.
<Style x:Key="SpecialButton" TargetType="{x:Type Button}">
<Style.Triggers>
<Trigger Property="Button.IsMouseOver" Value="true">
<Setter Property = "Background" Value="Red"/>
</Trigger>
<Trigger Property="Button.IsPressed" Value="true">
<Setter Property = "Foreground" Value="Green"/>
</Trigger>
</Style.Triggers>
</Style>
Vlastnost může být typ kolekce i vlastnost obsahu XAML pro tento typ a odvozené typy, která je popsána v další části tohoto tématu.
Implicitní element kolekce vytvoří člen v reprezentaci logického stromu, i když se nezobrazuje v kódu jako prvek. Konstruktor nadřazeného typu obvykle provádí instanci kolekce, která je jednou z jejích vlastností, a počáteční prázdná kolekce se stane součástí stromu objektů.
Poznámka:
Obecné rozhraní seznamu a slovníku (IList<T> a IDictionary<TKey,TValue>) nejsou podporovány pro detekci kolekcí. Třídu však můžete použít List<T> jako základní třídu, protože implementuje IList přímo nebo Dictionary<TKey,TValue> jako základní třídu, protože implementuje IDictionary přímo.
V referenčních stránkách rozhraní .NET pro typy kolekcí je tato syntaxe s úmyslným vynecháním elementu objektu pro kolekci někdy zaznamenána v oddílech syntaxe XAML jako implicitní syntaxe kolekce syntaxe.
S výjimkou kořenového elementu je každý prvek objektu v souboru XAML, který je vnořený jako podřízený prvek jiného elementu, skutečně prvek, který je jedním nebo oběma z následujících případů: člen implicitní kolekce vlastnosti nadřazeného elementu nebo element, který určuje hodnotu vlastnosti obsahu XAML pro nadřazený prvek (vlastnosti obsahu XAML budou popsány v nadcházející části). Jinými slovy, vztah nadřazených elementů a podřízených prvků na stránce revizí je opravdu jeden objekt v kořenovém adresáři a každý prvek objektu pod kořenem je buď jedna instance, která poskytuje hodnotu vlastnosti nadřazeného objektu, nebo jedna z položek v kolekci, která je také hodnotou vlastnosti typu kolekce nadřazeného objektu. Tento koncept s jedním kořenem je společný s JAZYKem XML a často se posiluje v chování rozhraní API, která načítají XAML, jako Loadje .
Následující příklad je syntaxe s elementem object pro kolekci (GradientStopCollection) zadaný explicitně.
<LinearGradientBrush>
<LinearGradientBrush.GradientStops>
<GradientStopCollection>
<GradientStop Offset="0.0" Color="Red" />
<GradientStop Offset="1.0" Color="Blue" />
</GradientStopCollection>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
Mějte na paměti, že není vždy možné explicitně deklarovat kolekci. Například pokus o deklaraci TriggerCollection explicitně v dříve zobrazeném Triggers příkladu by selhal. Explicitní deklarování kolekce vyžaduje, aby třída kolekce podporovala konstruktor bez parametrů a TriggerCollection nemá konstruktor bez parametrů.
Vlastnosti obsahu XAML
Syntaxe obsahu XAML je syntaxe, která je povolená pouze u tříd, které určují ContentPropertyAttribute jako součást deklarace třídy. ContentPropertyAttribute Odkazuje na název vlastnosti, která je content vlastnost pro daný typ elementu (včetně odvozených tříd). Při zpracování procesorem XAML budou všechny podřízené prvky nebo vnitřní text nalezené mezi levou a pravou značkou elementu objektu přiřazeny hodnotě vlastnosti obsahu XAML pro daný objekt. Můžete zadat explicitní prvky vlastností pro vlastnost obsahu, ale toto použití se obecně nezobrazuje v oddílech syntaxe XAML v odkazu na .NET. Explicitní/podrobná technika má příležitostnou hodnotu pro srozumitelnost značek nebo jako záležitost stylu značek, ale obvykle záměrem vlastnosti obsahu je zjednodušit revize tak, aby prvky, které jsou intuitivně související jako nadřazený-podřízený, mohou být vnořené přímo. Značky elementů vlastností pro jiné vlastnosti elementu nejsou přiřazeny jako "content" pro striktní definici jazyka XAML; zpracovávají se dříve v pořadí zpracování analyzátoru XAML a nepovažují se za "obsah".
Hodnoty vlastností obsahu XAML musí být souvislé.
Hodnota vlastnosti obsahu XAML musí být uvedena buď zcela před nebo zcela za všemi ostatními prvky vlastnosti na daném prvku objektu. To platí, zda je hodnota vlastnosti obsahu XAML zadána jako řetězec, nebo jako jeden nebo více objektů. Například následující kód se neanalybuje:
<Button>I am a
<Button.Background>Blue</Button.Background>
blue button</Button>
To je v podstatě neplatné, protože pokud byla tato syntaxe explicitní pomocí syntaxe elementu vlastnosti obsahu, pak by byla vlastnost obsahu nastavena dvakrát:
<Button>
<Button.Content>I am a </Button.Content>
<Button.Background>Blue</Button.Background>
<Button.Content> blue button</Button.Content>
</Button>
Podobně neplatný příklad je, pokud je vlastnost obsahu kolekce a podřízené prvky jsou propletené s prvky vlastnosti:
<StackPanel>
<Button>This example</Button>
<StackPanel.Resources>
<SolidColorBrush x:Key="BlueBrush" Color="Blue"/>
</StackPanel.Resources>
<Button>... is illegal XAML</Button>
</StackPanel>
Kombinace vlastností obsahu a syntaxe kolekce
Chcete-li přijmout více než jeden objekt element jako obsah, typ content vlastnost musí být konkrétně typ kolekce. Podobně jako syntaxe elementu vlastnosti pro typy kolekcí musí procesor XAML identifikovat typy, které jsou typy kolekcí. Pokud prvek má vlastnost obsahu XAML a typ vlastnosti obsahu XAML je kolekce, implicitní typ kolekce nemusí být zadán v kódu jako element objektu a vlastnost obsahu XAML nemusí být určena jako element property. Zjevná kon režim stanu l v kódu teď může mít přiřazených více než jeden podřízený prvek jako obsah. Následuje syntaxe obsahu pro odvozenou Panel třídu. Všechny Panel odvozené třídy vytvářejí vlastnost obsahu XAML , Childrenkterá vyžaduje hodnotu typu UIElementCollection.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
<StackPanel>
<Button>Button 1</Button>
<Button>Button 2</Button>
<Button>Button 3</Button>
</StackPanel>
</Page>
Všimněte si, že prvek vlastnosti pro Children ani prvek pro prvek UIElementCollection není vyžadován v kódu. Toto je funkce návrhu XAML, která rekurzivně obsahovala prvky, které definují uživatelské rozhraní, jsou intuitivněji reprezentovány jako strom vnořených elementů s okamžitými relacemi elementů nadřazeného-podřízeného prvku bez intervenování značek elementů vlastností nebo objektů kolekce. Ve skutečnosti nelze UIElementCollection explicitně specifikovat v kódu jako objektový prvek návrhem. Vzhledem k tomu, že jeho jediné zamýšlené použití je jako implicitní kolekce, UIElementCollection nezpřístupňuje veřejný konstruktor bez parametrů, a proto nelze vytvořit instanci jako prvek objektu.
Kombinování prvků vlastností a elementů objektů v objektu s vlastností obsahu
Specifikace XAML deklaruje, že procesor XAML může vynutit, aby objektové prvky, které se používají k vyplnění vlastnosti obsahu XAML v rámci elementu objektu, musí být souvislé a nesmí být smíšené. Toto omezení pro kombinování prvků vlastností a obsahu je vynuceno procesory WPF XAML.
Jako první okamžitý kód v elementu objektu můžete mít podřízený prvek objektu. Pak můžete zavést prvky vlastností. Nebo můžete zadat jeden nebo více prvků vlastností, pak obsah, pak více prvků vlastností. Jakmile však prvek vlastnosti následuje obsah, nelze zavést žádný další obsah, můžete přidat pouze prvky vlastností.
Tento požadavek na pořadí prvků vlastností obsahu se nevztahuje na vnitřní text použitý jako obsah. Je však stále dobrým stylem revizí zachovat vnitřní text souvislý, protože významné prázdné znaky budou obtížné rozpoznat vizuálně v kódu, pokud jsou prvky vlastností interspersovány s vnitřním textem.
Obory názvů jazyka XAML
Žádný z předchozích příkladů syntaxe nezadá jiný obor názvů XAML než výchozí obor názvů XAML. V typických aplikacích WPF je výchozí obor názvů XAML určen jako obor názvů WPF. Můžete zadat jiné obory názvů XAML než výchozí obor názvů XAML a stále používat podobnou syntaxi. Poté, kde je třída pojmenována, která není přístupná v rámci výchozího oboru názvů XAML, musí před název třídy předcházet předponu oboru názvů XAML, jak je namapováno na odpovídající obor názvů CLR. Jedná se například o syntaxi elementu objektu pro <custom:Example/>
vytvoření instance instance Example
třídy, kde byl dříve namapován custom
obor názvů CLR obsahující tuto třídu (a případně informace o externím sestavení, které obsahují záložní typy).
Další informace o oborech názvů XAML naleznete v tématu Obory názvů XAML a mapování oboru názvů pro WPF XAML.
Rozšíření značek
XAML definuje programovací entitu rozšíření značek, která umožňuje řídicí znak z normálního zpracování procesoru XAML hodnot řetězcových atributů nebo objektů elementů a deferuje zpracování do backing třídy. Znak, který identifikuje rozšíření značek procesoru XAML při použití syntaxe atributu je levá složená složená závorka ({) následovaná libovolným jiným znakem než pravou složenou složenou závorkou (}). První řetězec za levou složenou složenou závorkou musí odkazovat na třídu, která poskytuje konkrétní chování rozšíření, kde odkaz může vynechat podřetězce "Extension", pokud je tento podřetězce součástí názvu třídy true. Následně se může objevit jedna mezera a každý úspěšný znak se použije jako vstup implementací rozšíření, dokud nebude zjištěna pravá složená závorka.
Implementace .NET XAML používá MarkupExtension abstraktní třídu jako základ pro všechna rozšíření značek podporovaná WPF a také další architektury nebo technologie. Rozšíření značek, která wpF konkrétně implementuje, jsou často určena k poskytování prostředků pro odkazování na jiné existující objekty nebo k odložení odkazů na objekty, které budou vyhodnoceny za běhu. Například jednoduchá datová vazba WPF se provádí zadáním {Binding}
rozšíření značek místo hodnoty, kterou by určitá vlastnost obvykle proběhla. Mnoho rozšíření značek WPF umožňuje syntaxi atributu pro vlastnosti, kde syntaxe atributu by jinak nebyla možná. Objekt je například Style relativně složitý typ, který obsahuje vnořenou řadu objektů a vlastností. Styly ve WPF jsou obvykle definovány jako prostředek v objektu ResourceDictionarya následně odkazovány prostřednictvím jedné ze dvou rozšíření značek WPF, která požadují prostředek. Rozšíření značek vzdoruje vyhodnocení hodnoty vlastnosti na vyhledávání prostředku a umožňuje poskytnout hodnotu Style vlastnosti, přebírá typ Style, v syntaxi atributu jako v následujícím příkladu:
<Button Style="{StaticResource MyStyle}">My button</Button>
StaticResource
Zde identifikuje StaticResourceExtension třídu poskytující implementaci rozšíření značek. Další řetězec MyStyle
se používá jako vstup pro jiný než výchozí StaticResourceExtension konstruktor, kde parametr převzatý z rozšiřujícího řetězce deklaruje požadovanou ResourceKeyhodnotu . MyStyle
očekává se, že hodnota x:Key definovaného Style jako prostředek. StaticResource Markup Extension usage requests that resource be used to provide the Style property value through static resource lookup logic at load time.
Další informace o rozšířeních značek naleznete v tématu Rozšíření značek a WPF XAML. Odkaz na rozšíření značek a další programovací funkce XAML povolené v obecné implementaci .NET XAML naleznete v tématu Jazykové funkce oboru názvů XAML (x:). Informace o rozšířeních značek specifických pro WPF najdete v tématu Rozšíření WPF XAML.
Přidružené vlastnosti
Připojené vlastnosti jsou programovací koncept zavedený v JAZYCE XAML, kde vlastnosti mohou být vlastněny a definovány konkrétním typem, ale nastaveny jako atributy nebo elementy vlastností na libovolném prvku. Primárním scénářem, pro který jsou připojené vlastnosti, je umožnit podřízeným prvkům ve struktuře revizí hlásit informace nadřazeným elementům, aniž by bylo nutné rozsáhlý sdílený objektový model napříč všemi prvky. Naopak připojené vlastnosti mohou být použity nadřazenými prvky k sestavě informací podřízeným prvkům. Další informace o účelu připojených vlastností a o tom, jak vytvořit vlastní připojené vlastnosti, naleznete v tématu Přehled připojených vlastností.
Připojené vlastnosti používají syntaxi, která se povrchně podobá syntaxi prvku vlastnosti, ve které také zadáte typeName.kombinace propertyName . Existují dva důležité rozdíly:
Můžete použít typeName.kombinace propertyName i při nastavování připojené vlastnosti prostřednictvím syntaxe atributu. Připojené vlastnosti jsou jediným případem, kdy kvalifikující název vlastnosti je požadavek v syntaxi atributu.
Pro připojené vlastnosti můžete také použít syntaxi elementu vlastnosti. Pro typickou syntaxi elementu property je typeName, který zadáte, objekt element, který obsahuje element property. Pokud odkazujete na připojenou vlastnost, typeName je třída, která definuje připojenou vlastnost, nikoli obsahující prvek objektu.
Přidružené události
Připojené události jsou další programovací koncept zavedený v XAML, kde události mohou být definovány konkrétním typem, ale obslužné rutiny mohou být připojeny k libovolnému elementu objektu. V implementaci WOF je často typ, který definuje připojenou událost, statický typ, který definuje službu, a někdy jsou tyto připojené události vystaveny aliasem směrované události v typech, které službu zveřejňují. Obslužné rutiny pro připojené události se zadají prostřednictvím syntaxe atributů. Stejně jako u připojených událostí je syntaxe atributu rozšířena pro připojené události, aby umožňovala typeName.eventName usage, where typeName je třída, která poskytuje Add
a Remove
obslužné rutiny událostí pro připojenou infrastrukturu událostí, a eventName je název události.
Anatomie kořenového elementu XAML
Následující tabulka ukazuje typický kořenový element XAML rozdělený do původního stavu, který zobrazuje konkrétní atributy kořenového elementu:
Atribut | Popis |
---|---|
<Page |
Otevření elementu objektu kořenového elementu |
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
Výchozí obor názvů XAML (WPF) |
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
Obor názvů XAML jazyka XAML |
x:Class="ExampleNamespace.ExampleCode" |
Deklarace částečné třídy, která spojuje revize s libovolným kódem definovaným pro částečnou třídu |
> |
Konec elementu objektu pro kořen. Objekt ještě není zavřený, protože prvek obsahuje podřízené prvky. |
Nepovinná a nedopomněná použití XAML
Následující části popisují použití XAML, která jsou technicky podporovaná procesory XAML, ale vytvářejí vrcholy nebo jiné estetické problémy, které kolidují se zbývajícími soubory XAML čitelné pro člověka při vývoji aplikací obsahujících zdroje XAML.
Nepovinná použití elementů vlastností
Volitelné použití elementů vlastností zahrnuje explicitní zápis vlastností obsahu elementu, které procesor XAML považuje za implicitní. Když například deklarujete obsah objektu Menu, můžete se rozhodnout explicitně deklarovat Items kolekci Menu prvku jako <Menu.Items>
značku prvku vlastnosti a umístit každou z <Menu.Items>
nich MenuItem do , místo použití implicitního chování procesoru XAML, které všechny podřízené prvky Menu musí být a MenuItem jsou umístěny v kolekciItems. Volitelné použití někdy může pomoct vizuálně objasnit strukturu objektu, jak je znázorněno v kódu. Nebo se někdy může explicitní použití elementu vlastnosti vyhnout značkám, které jsou technicky funkční, ale vizuálně matoucí, například vnořené rozšíření značek v rámci hodnoty atributu.
Full typeName.memberName Qualified Attributes
TypeName.Formulář memberName pro atribut ve skutečnosti funguje obecněji než pouze směrovaný případ události. Ale v jiných situacích, že forma je nadbytečná a měli byste se jí vyhnout, pokud pouze z důvodů stylu revizí a čitelnosti. V následujícím příkladu jsou všechny tři odkazy na Background atribut zcela ekvivalentní:
<Button Background="Blue">Background</Button>
<Button Button.Background="Blue">Button.Background</Button>
<Button Control.Background="Blue">Control.Background</Button>
Button.Background
funguje, protože kvalifikovaný vyhledávání pro tuto vlastnost Button je úspěšné (Background bylo zděděno z Control) a Button je třída object elementu nebo základní třídy. Control.Background
funguje, protože Control třída ve skutečnosti definuje Background a Control je Button základní třídou.
Nicméně následující typeName.Příklad formuláře memberName nefunguje a je tedy zobrazen komentář:
<!--<Button Label.Background="Blue">Does not work</Button> -->
Label je další odvozená Controltřída , a pokud jste zadali Label.Background
v rámci Label elementu objektu, toto použití by fungovalo. Vzhledem k tomu, že Label není třída nebo základní třída Button, zadané chování procesoru XAML je pak zpracovat Label.Background
jako připojenou vlastnost. Label.Background
není k dispozici připojená vlastnost a toto použití selže.
baseTypeName.memberName – elementy vlastností
Podobně jako typeName.Formulář memberName funguje pro syntaxi atributu , baseTypeName.Syntaxe memberName funguje pro syntaxi elementu vlastnosti. Například následující syntaxe funguje:
<Button>Control.Background PE
<Control.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
<GradientStop Color="Yellow" Offset="0.0" />
<GradientStop Color="LimeGreen" Offset="1.0" />
</LinearGradientBrush>
</Control.Background>
</Button>
Zde byl prvek vlastnosti uveden, jako Control.Background
i když byl prvek vlastnosti obsažen v Button
.
Ale stejně jako typeName.memberName form for attributes, baseTypeName.memberName je špatný styl v revizích a měli byste se tomu vyhnout.
Viz také
.NET Desktop feedback