A XAML leíró nyelv

Az XAML koncepció alapjai

Az XAML Objektum elemek

Objektum elemek: Az olyan XAML tageket, amik nem egy attribútumot definiálnak (lásd. később) objektum elemeknek nevezzük. Az objektum elemek tulajdonképpen egy a mögöttes alkalmazás logikában definiált osztály egy példánya.

v Az XAML egy szabály halmaz, ami leképezi az objektum elemeket osztályokra vagy struktúrákra, az attribútumokat tulajdonságokra vagy eseményekre, és az XML névtereket CLR névterekre. Az XAML elemek leképeződnek Microsoft .NET típusokra ahogy azok a kapcsolodó assembly-kben definiálva vannak, és az attribútumok pedig ezen típusok tagjai (member) lesznek.

<StackPanel>
<Button Content="Click Me"/>
</StackPanel>
A példában két objektum elem látható: <StackPanel> (lezáró tag-el), és a <Button/> (ami szintén több attribútumot tartalmaz). A nevek (StackPanel és Button) adják meg azon osztályok nevét, amiket a WPF definiál, és amik része a WPF assembly-knek. Amikor egy objektum elem létrehozásra kerül, azzal tulajdonképpen az XAML betöltésekor egy példányosítása jön létre a megnevezett osztálynak. Minden példány létrehozásakor az alapértelmezet konstruktora hívódik meg a létrehozandó osztálynak vagy struktúrának. Ahhoz hogy egy osztály vagy struktúra objektum elemként példányosítható legyen az XAML nyelv segítségével, lennie kell egy publikus (public), paraméter nélküli konstruktorának.

Tulajdonságok az XAML-ben

Az osztály tulajdonságok (attribútumok) XAML-ben egy objektum elem tulajdonságaival egyeznek meg. A tulajdonság megadása több féle szintaxisban is történhet, ami mindig az aktuális tulajdonság karakterisztikájától függ.

<Button Background="Blue" Foreground="Red" Content="This is a button"/>

Az attribútumok szintaxisa

Néhány tulajdonság megadása egyszerű attribútum szintaxissal (ahogy az XML-ben is szokás) nem lehetséges, mivel az objektum, vagy az információ amit át kell adni nem fejezhető ki egy egyszerű string segítségével. Ezekben az esetekben más szintaxist kell használnunk, mint a megszokott XML tulajdonság megadási mód. Ilyenkor a tulajdonság megadása egy speciális tag-el történik. Ennek a tagnek a tartalma lesz maga az attribútumnak értékül adandó objektum. Ezen tag szintaxisa <TypeName.Property>. Ezután a tulajdonság megadása szükséges. Ha az megtörtént a taget le kell zárni a </TypeName.Property> alakban. Azokban az esetekben, ha mind a két tulajdonság megadási mód támogatott, akkor bármelyiket is választjuk, általában ugyan arra az eredményre vezetnek. Azonban az olyan finomságok, mint például a white-space kezelés lényegesen eltér a két esetben. (lásd később) Azonban, ha lehet a klasszikus XML-szerű szintaxis használata ajánlott, hisz az sokkal kompaktabb, átláthatóbb kódot eredményez, de ez csak kódolási stílus kérdése, nem egy technikai szabály.

A következő példa megmutatja hogyan lehet az előző példa tulajdonságait attribútum szintaxis segítségével megadni.

<Button>
<Button.Background>
<SolidColorBrush Color="Blue"/>
</Button.Background>
<Button.Foreground>
<SolidColorBrush Color="Red"/>
</Button.Foreground>
<Button.Content>
This is a button
</Button.Content>
</Button>
A tulajdonság elem szintaxis értelmezése alapvetően különbözik az XML értelmezéstől. Az XML számára <TypeName.Property> egy új elemet jelent, ami nem kapcsolódik szükségszerűen a TypeName elemhez. Az XAML számára ugyanez direkt utalás jelent egy TypenName típusú objektum Property tulajdonságára, és ezt a tulajdonságot a tag tartalmával teszi egyenlővé.

Tulajdonságok és öröklődés

Az XAML attribútumok között megjelenő tulajdonságokat a WPF elemek sokszor előre definiált alap osztályokból öröklik. Például az előző példa Background tulajdonsága nem közvetlenül a Button osztályban lett definiálva, hanem az osztály egy Control nevű alaposztályból származtatják, aminek létezik egy Background tulajdonsága.

Ez az öröklési viselkedés egy másik alapvető különbség az XML és a XAML értelmezése között. Az osztály öröklődés (legfőképpen amikor egy közreműködő osztály absztrakt) az oka annak, hogy az XAML elemek és az ő elérhető attribútumaik reprezentációja bonyolult séma típusok segítségével, amit az XML programozáshoz használnak. (Például DTD és XSD formátum). Azonban az X az XAML nevében kiterjeszthetőt jelent, és a kiterjeszthetőség megköveteli minden megadott reprezentáció teljességét.

Referencia értékek és leírás kiterjesztések

A leírás kiterjesztéseket az XAML-ben kapcsos zárójelek ({ és }) közé kell tenni. Ez a jelölés átirányítja az XAML feldolgozót egy string általános feldolgozásról a string tartalmának feldolgozására, értelmezésére.

Amikor a tulajdonságok referencia típus értéket vesznek fel akkor gyakran megkövetelnek egy attribútum szintaxisú elem definíciót (ami mindig új példányt hoz létre az objektumból), vagy egy objektum referenciát a leíráson keresztül. A leírás kiterjesztés képes visszatérni egy már korábban példányosított objektumra mutató referenciával, így egy korábban objektum elemmel létrehozott objektum is átadható paraméterként.

Amikor leírás kiterjesztést használunk arra, hogy egy attribútumnak értéket adjunk, az attribútum érték behelyettesítési értékét az alkalmazás logika releváns osztálya szolgáltatja. A leggyakoribb leírás kiterjesztések a WPF alkalmazásokban a Binding, ami adatok hozzárendelésére használható és az erőforrás referenciák a StaticResource és a DynamicResource.

A következő példa Style tulajdonság értéke attribútum szintaxist használ. A Style tulajdonság felveszi egy példányát a Style osztálynak, egy referencia típusnak, ami alapvetően nem lehetne megadható egy attribútum szintaxis során. Ebben az esetben, az attribútum referencia egy leírás kiterjesztés, StaticResource. Amikor a leírás kiterjesztés feldolgozásra kerül, visszatér egy referenciával arra a Style objektumra ami korábban definiálva lett, az ún. erőforrás könyvtárban.

<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>

Típuskonvertált attribútum értékek

Sok WPF típus vagy azok attribútumai kiterjesztik az alapvető string feldolgozási szabályt, így string segítségével komplexebb típusok megadása is lehetséges. Alkalmazás kód szinten ez a feldolgozás CLR típus konverterek bevezetésével történik, amik feldolgozzák a string értékét. A Thickness struktúra típust általában arra használják, hogy megadja egy négyszögletes terület mértékét, mint például a Margin(margó)-nál. Ebben a példában látható az, hogy egy speciális típuskonvertált attribútum kifejezhető egy string segítségével, ami könnyebé teszé az XAML leírás használatát.

<Button Margin="10,20,10,30" Content="Click me"/>
A következő példa hatása megegyezik az előzővel, csak típuskonvertált attribútum nélkül.
<Button Content="Click me">
<Button.Margin>
<Thickness Left="10" Top="20" Right="10" Bottom="30"/>
</Button.Margin>
</Button>