A XAML leíró nyelv

XAML sajátosságok

Gyűjtemény típus és az XAML Gyűjtemény Attribútum

Az XAML egy olyan nyelvi elemet vezet be, melynek segítségével az olyan objektum elem, ami egy gyűjtemény típust reprezentál, elhagyható a leírásból. Amikor az XAML feldolgozó egy olyan tulajdonsághoz ér, amely gyűjtemény típust vár értékül, a tartalmazó osztályban definiált gyűjtemény referencia implicit létre jön, még akkor is ha nincs jelen objektum elem ahhoz a gyűjteményhez a leírásban. A gyűjtemény típusokhoz tartozó SDK referencia oldalakon, ez gyakran fel van tüntetve "Implicit Collection Syntax"-ként.

Az implicit gyűjtemény szintaktika elérhető azon típusokra melyek az IList vagy az IDictionary típusokból származnak, vagy tömbökre.

Az implicit gyűjtemény típus megfigyelhető az XAML erőforrásos példán:

<Page.Resources>
<SolidColorBrush x:Key="MyBrush" Color="Gold"/>
<Style TargetType="Border" x:Key="PageBackground">
<Setter Property="Background" Value="Blue"/>
</Style>


...


</Page.Resources>
<StackPanel>
<Border Style="{StaticResource PageBackground}">


...


</Border>
</StackPanel>

A gyökér elem kivételével minden objektum elemre az oldalon, amely egy másik objektum elem gyermeke, a következő két eset valamelyike (vagy mind a kettő) vonatkozhat: az elem tagja egy implicit gyűjtemény tulajdonságának a szülő elemnek, vagy egy elem ami egy értéket szolgáltat a szülő elem XAML tartalom tulajdonnsága számára. Más szóval, a kapcsolat a szülő elemek és a gyermek elemek között a leíró oldalon igazából a következő: egy egyedül álló gyökér objektum létezik, és minden alá létrehozott elem egy osztály példány, ami egy tulajdonság értéket szolgáltat a szülőjének, vagy egy elem egy gyűjteményen belül, ami szintén egy gyűjtemény típusú tulajdonsága a szülőnek.

A következő példa az előző példával ekvivalens hatású, de a ResourceDictionary elemei explicit módon vannak leírva.

<Page.Resources>
<ResourceDictionary>
<SolidColorBrush x:Key="MyBrush" Color="Gold"/>
<Style TargetType="Border" x:Key="PageBackground">
<Setter Property="Background" Value="Blue"/>
</Style>


...


</ResourceDictionary>
</Page.Resources>
<StackPanel>
<Border Style="{StaticResource PageBackground}">


...


</Border>
</StackPanel>
</Page>

Az XAML tartalom tulajdonság

Másik lehetősége az XAML nyelvnek, hogy bármely osztálynak ami használható XAML objektum elemként, kiválasztható egy a tulajdonságai közül, hogy az legyen az XAML tartalom tulajdonsága az osztálynak. Amikor az XAML feldolgozó kezel egy objektum elemet, aminek van XAML tartalom tulajdonsága, ezen objektum bármely XML gyermeke úgy lesz feldolgozva, mintha egy implicit objektum tulajdonság érték lenne. Ez a speciális objektum tulajdonság a tartalom tulajdonság. A tartalom tulajdonság kiírása elhagyható, minden gyermek eleme az objektumnak automatikusan értékülk adódik ennek az attribútumnak.

Egy példa az implicit definiált tartalom tulajdonságra.

<StackPanel>
<Button Content="Click Me"/>
</StackPanel>
Itt a Button egy gyermeke a StackPanel-nek. Ebben a leírásban két tag is kihagyásra került, két különböző okból.

Kihagyott StackPanel.Children tulajdonság: A StackPanel a Panel osztályból van származtatva. A Children attribútum a Panel tartalom tulajdonsága. Minden ebből származtatott osztályra jellemző ez, így a Children attribútum elhagyható.

Kihagyott UIElementCollection objektum elem: A Children tulajdonságnak UIElementCollection típust kell értékül adni, ami az IList típust valósítja meg. Így a gyüjteményekre vonatkozó szabályok miatt ez az elem elhagyható.
<StackPanel>
<StackPanel.Children>
<!--<UIElementCollection>-->
<Button>
<Button.Content>
Click Me
</Button.Content>
</Button>
<!--</UIElementCollection>-->
</StackPanel.Children>
</StackPanel>

Belső szöveg és az XAML tartalom tulajdonság
A StackPanel Button példának van még egy változata.

<StackPanel>
<Button>Click Me</Button>
</StackPanel>
A tartalom tulajdonságnak ebben az esetben a "Click Me" string adódik át.

A szövegnek mindig folytonosnak kel lennie. Az XAML leírásban a szöveg nem szakítható meg tagekkel.

Az XAML névterek és a gyökér elem

Az XAML fájlnak csak egy gyökér eleme lehet, ahogy azt a jól formázott XML-nél is megszokhattuk. Tipikusan ez az elem határozza meg az alkalmazás modelt (Window, Page, ResourceDictionary, Application). A következő példa megmutatja, hogy hogyan kezdődik egy tipikus XAML fájl, ami egy WPF oldalt definiál.

<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

...

</Page>
Az xmlns és xmlns:x attribútumok határozzák meg az XAML processzort és az XAML elemek definícióját.

Az x: prefix

x:Key: Egyedi kulcsot rendel egy erőforráshoz a ResourceLibrary-ben, hogy később hivatkozni lehessen rá.

x:Class:Meghatározza a feldolgozó CLR névteret és osztályt.

x:Name: Futás idejű nevet rendel egy elem példányhoz.

x:Static: Enged egy statikus értékre való hivatkozást, ami más esetben nem lenne engedélyezett XAML-ben.

x:Type: Típus referenciát hoz létre.
Az XAML névtér (x:) nyelvi elemei

Whitespace-k és betűk

Az XAML kis és nagybetű függő. Az objektum elemek, tulajdonságok és attribútum nevek megadásánál mindig ügyelni kell a kis és nagybetű különbségre. Ez igaz az XAML alatt lévő alkalmazás logikában meghatározott osztály nevekre is. Az értékek nem mindig kis és nagybetű érzékenyek. Az értékeknél ez a tulajdonság az alkalmazott konverter viselkedésétől függ. Például a Boolean konverter eltekint a kis és nagybetű különbségektől.

Az XAML feldolgozó figyelmen kívül minden lényegtelen whitespace-t, és a lényegeseket is normalizálja. Ez a viselkedés akkor lehet fontos, ha tartalom tulajdonságot adunk meg string fomrájában. A legyegyszerűbb esetekben XAML átkonvertálja a space-eket, tabulátorokat és sortöréseket space-é, aztán mindössze egy space-t hagy meg a következő string literálig.