Megosztás a következőn keresztül:


XAML áttekintése (WPF .NET)

Ez a cikk az XAML nyelv funkcióit ismerteti, és bemutatja, hogyan használható az XAML a Windows Presentation Foundation (WPF) alkalmazások írására. Ez a cikk kifejezetten a WPF által implementált XAML-et ismerteti. Maga az XAML egy nagyobb nyelvi fogalom, mint a WPF.

Mi az az XAML?

Az XAML egy deklaratív korrektúranyelv. A .NET programozási modellre alkalmazott XAML leegyszerűsíti a felhasználói felület létrehozását egy .NET-alkalmazáshoz. A deklaratív XAML-korrektúra látható felhasználói felületi elemeit létrehozhatja, majd a felhasználói felület definícióját elválaszthatja a futásidejű logikától a kód mögötti fájlokkal, amelyek részleges osztálydefiníciókon keresztül csatlakoznak a korrektúrához. Az XAML közvetlenül az objektumok példányosítását jelöli a szerelvényekben meghatározott háttértípusok meghatározott halmazában. Ez ellentétben áll a legtöbb más jelölőnyelvvel, amelyek általában értelmezett nyelvek, anélkül, hogy ilyen közvetlen kapcsolat állna a háttér-típus rendszerhez. Az XAML olyan munkafolyamatot tesz lehetővé, amelyben külön felek dolgozhatnak egy alkalmazás felhasználói felületén és logikáján, akár különböző eszközökkel is.

Szövegként ábrázolva az XAML-fájlok olyan XML-fájlok, amelyek általában .xaml kiterjesztéssel rendelkeznek. A fájlok bármilyen XML-kódolással kódolhatók, de az UTF-8 kódolás jellemző.

Az alábbi példa bemutatja, hogyan hozhat létre gombot egy felhasználói felület részeként. Ez a példa azt mutatja be, hogyan képviseli az XAML a felhasználói felület programozási metaforáit (ez nem teljes minta).

<StackPanel>
    <Button Content="Click Me"/>
</StackPanel>

XAML szintaxis röviden

A következő szakaszok az XAML szintaxis alapszintű formáit ismertetik, és egy rövid korrektúra-példát mutatnak be. Ezek a szakaszok nem szolgálnak teljes körű információval az egyes szintaxisformákról, például arról, hogy ezek hogyan jelennek meg a háttérrendszerben. Az XAML szintaxis jellemzőiről további információt XAML szintaxis részletescímű témakörben talál.

A következő néhány szakaszban szereplő anyagok nagy része elemi jellegű lesz, ha korábban már jártas az XML-nyelvben. Ez az XAML egyik alapvető tervezési alapelvének következménye. Az XAML-nyelv saját fogalmakat határoz meg, de ezek a fogalmak az XML-nyelven és a korrektúra formájában működnek.

XAML-objektumelemek

Az objektumelemek általában egy típuspéldányt deklarálnak. Ez a típus az XAML-t nyelvként használó technológia által hivatkozott szerelvényekben van definiálva.

Az objektumelem szintaxisa mindig egy nyitó szögletes zárójeltel (<) kezdődik. Ezt követi annak a típusnak a neve, amelyben példányt szeretne létrehozni. (A név tartalmazhat egy előtagot, egy koncepciót, amelyet később ismertetünk.) Ezt követően opcionálisan deklarálhat attribútumokat az objektumelemen. Az objektumelem címkéjének befejezéséhez használjon záró szögletes jelet (>). Ehelyett használhat olyan önzáró űrlapot, amely nem tartalmaz tartalmat, ha egymás után egy előre perjellel és záró szögletes zárójelmel tölti ki a címkét (/>). Tekintsen például újra a korábban látható jelölési részletre.

<StackPanel>
    <Button Content="Click Me"/>
</StackPanel>

Ez két objektumelemet határoz meg: <StackPanel> (tartalommal és egy későbbi zárócímkével), valamint <Button .../> (önzáró űrlap, több attribútummal). Az objektumelemek StackPanel és Button mindegyike a WPF által definiált és a WPF-könyvtárak részét képező osztály nevére képez le. Objektumelem-címke megadásakor létre kell hoznia egy XAML-feldolgozásra vonatkozó utasítást az alapul szolgáló típus új példányának létrehozásához. Minden példány az alapul szolgáló típus paraméter nélküli konstruktorának meghívásával jön létre az XAML elemzésekor és betöltésekor.

Attribútumszintaxis (tulajdonságok)

Az objektumok tulajdonságai gyakran az objektumelem attribútumaiként is kifejezhetők. Az attribútum szintaxisa a beállított objektumtulajdonságot, majd a hozzárendelési operátort (=) adja meg. Az attribútum értéke mindig sztringként van megadva, amely idézőjelekben található.

Az attribútumszintaxis a leggördülékenyebb tulajdonságbeállítási szintaxis, és a leg intuitívabb szintaxis azoknak a fejlesztőknek, akik korábban már használták a korrektúranyelveket. A következő jelölőnyelv például létrehoz egy olyan gombot, amely piros szöveggel és kék háttérrel rendelkezik, valamint a megjelenítési szövege Content.

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

Tulajdonságelem szintaxisa

Egy objektumelem bizonyos tulajdonságai esetében az attribútumszintaxis nem lehetséges, mert a tulajdonság értékének megadásához szükséges objektum vagy információ nem fejezhető ki megfelelően az idézőjelen és az attribútumszintaxis sztringkorlátozásán belül. Ezekben az esetekben egy másik, tulajdonságelem-szintaxisnak nevezett szintaxis használható.

A tulajdonságelem kezdőcímkéjének szintaxisa <TypeName.PropertyName>. A címke tartalma általában annak a típusnak az objektumeleme, amelyet a tulajdonság értékként vesz fel. A tartalom megadása után be kell zárnia a tulajdonságelemet egy zárócímkével. A zárótag szintaxisa </TypeName.PropertyName>.

Ha lehetséges attribútumszintaxis, az attribútumszintaxis használata általában kényelmesebb, és kompaktabb korrektúrát tesz lehetővé, de ez gyakran csak stílus kérdése, nem pedig technikai korlátozás. Az alábbi példa ugyanazokat a tulajdonságokat mutatja be, mint az előző attribútumszintaxis-példában, de ezúttal a tulajdonságelem szintaxisát használja a Buttonösszes tulajdonságához.

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

Gyűjtemény szintaxisa

Az XAML nyelv tartalmaz néhány olyan optimalizálást, amely emberi olvasásra alkalmasabb korrektúrát eredményez. Az egyik ilyen optimalizálás az, hogy ha egy adott tulajdonság gyűjteménytípust vesz igénybe, akkor a tulajdonság értékében gyermekelemként deklarált elemek a gyűjtemény részévé válnak. Ebben az esetben a gyermekobjektum-elemek gyűjteménye a gyűjteménytulajdonságra beállított érték.

Az alábbi példa a gyűjtemény szintaxisát mutatja be a GradientStops tulajdonság értékeinek beállításához.

<LinearGradientBrush>
    <LinearGradientBrush.GradientStops>
        <!-- no explicit new GradientStopCollection, parser knows how to find or create -->
        <GradientStop Offset="0.0" Color="Red" />
        <GradientStop Offset="1.0" Color="Blue" />
    </LinearGradientBrush.GradientStops>
</LinearGradientBrush>

XAML-tartalom tulajdonságai

Az XAML egy olyan nyelvi funkciót határoz meg, amely lehetővé teszi, hogy az osztály pontosan az egyik tulajdonságát jelölje ki az XAML tartalom tulajdonságként. Az objektumelem gyermekelemei az adott tartalomtulajdonság értékének beállítására szolgálnak. Más szóval, a tartalomtulajdonság esetében egyedülálló módon kihagyhat egy tulajdonságelemet, amikor az adott tulajdonságot XAML jelölésben állítja be, és így láthatóbb szülő-gyermek metaforát hozhat létre a jelölésben.

Például a Border a tartalom tulajdonságát adja meg a Child-nek. A rendszer a következő két Border elemet azonos módon kezeli. Az első a tartalomtulajdonság szintaxisát használja ki, és kihagyja a Border.Child tulajdonságelemet. A második ábrázolja Border.Child-t explicit módon.

<Border>
    <TextBox Width="300"/>
</Border>
<!--explicit equivalent-->
<Border>
    <Border.Child>
        <TextBox Width="300"/>
    </Border.Child>
</Border>

Az XAML nyelv szabálya szerint az XAML tartalomtulajdonság értékét teljes egészében az adott objektumelem bármely más tulajdonságeleme előtt vagy után kell megadni. A következő jelölés például nem fordul le.

<Button>I am a
  <Button.Background>Blue</Button.Background>
  blue button</Button>

Az XAML szintaxis jellemzőiről további információt XAML szintaxis részletescímű témakörben talál.

Szöveges tartalom

Kis számú XAML-elem közvetlenül feldolgozhatja a szöveget tartalomként. Ennek engedélyezéséhez az alábbi esetek egyikének igaznak kell lennie:

  • Az osztálynak deklarálnia kell egy tartalomtulajdonságot, és a tartalomtulajdonságnak sztringhez rendelhető típusúnak kell lennie (a típus lehet Object). Például bármelyik ContentControl a Content-et használja mint tartalomtulajdonságot, és a típusa Object; ez támogatja a következő felhasználást egy ContentControl-on, mint például egy Button: <Button>Hello</Button>.

  • A típusnak típuskonvertert kell deklarálnia, ebben az esetben a szövegtartalmat használják inicializálási szövegként az adott típuskonverterhez. Például <Brush>Blue</Brush> kefévé alakítja a Blue tartalomértékét. Ez az eset a gyakorlatban kevésbé gyakori.

  • A típusnak ismert XAML-nyelvi primitívnek kell lennie.

Tartalomtulajdonságok és gyűjteményszintaxis együttes használata

Vegyük ezt a példát.

<StackPanel>
    <Button>First Button</Button>
    <Button>Second Button</Button>
</StackPanel>

Itt minden Button a StackPanelgyermekeleme. Ez egy egyszerűsített és intuitív korrektúra, amely két különböző okból kihagy két címkét.

  • Kihagyott StackPanel.Children tulajdonság elem:StackPanel származik Panel-ból. Panel definiálja a Panel.Children XAML-tartalomtulajdonságként.

  • Kihagyott UIElementCollection objektumelem: A Panel.Children tulajdonság a IListimplementálására szolgáló UIElementCollectiontípust veszi fel. A gyűjtemény elemcímkéje kihagyható az olyan gyűjtemények feldolgozására vonatkozó XAML-szabályok alapján, mint például a IList. (Ebben az esetben a UIElementCollection valójában nem példányosítható, mert nem biztosít paraméter nélküli konstruktort, ezért van a UIElementCollection objektumelem ki van kommentelve).

<StackPanel>
    <StackPanel.Children>
        <!--<UIElementCollection>-->
        <Button>First Button</Button>
        <Button>Second Button</Button>
        <!--</UIElementCollection>-->
    </StackPanel.Children>
</StackPanel>

Attribútumszintaxis (események)

Az attribútumszintaxis olyan tagok esetében is használható, amelyek nem tulajdonságok, hanem események. Ebben az esetben az attribútum neve az esemény neve. Az XAML eseményeinek WPF-implementációjában az attribútum értéke annak a kezelőnek a neve, aki megvalósítja az esemény delegáltját. Az alábbi korrektúra például hozzárendel egy kezelőt a Click eseményhez egy korrektúra által létrehozott Button:

<Button Click="Button_Click" >Click Me!</Button>

A WPF-ben több esemény és XAML van, mint az attribútum szintaxisának ez a példája. Felmerülhet például a kérdés, hogy az itt hivatkozott ClickHandler mit jelöl, és hogyan van definiálva. Ezt a cikk közelgő Események és XAML-kód mögötti szakaszában ismertetjük.

Kis- és nagybetűk és szóközök az XAML-ben

Az XAML általában megkülönbözteti a kis- és nagybetűket. A háttértípusok feloldása érdekében a WPF XAML a kisebb és nagyobb betűk megkülönböztetése szempontjából érzékeny ugyanazokra a szabályokra, mint amelyek a CLR-re vonatkoznak. Az objektumelemeket, a tulajdonságelemeket és az attribútumneveket mind a bizalmas burkolat használatával kell megadni, ha a szerelvény mögöttes típusához vagy egy típus taghoz hasonlítják a nevet. Az XAML nyelvi kulcsszavak és a primitívek is megkülönböztetik a kis- és nagybetűket. Az értékek nem mindig tesznek különbséget a kis- és nagybetűk között. Az értékek kis- és nagybetűk érzékenysége attól függ, hogy a típuskonverter milyen viselkedést alkalmaz az értéket tartalmazó tulajdonsághoz vagy a tulajdonság értéktípusához. Például a Boolean típust használó tulajdonságok elfogadhatják a true vagy True értékeket egyenértékűként, de csak azért, mert a natív WPF XAML elemző sztringből Boolean típusra való átalakítása már lehetővé teszi ezeket egyenértékűként.

A WPF XAML processzorok és szerializálók figyelmen kívül hagyják vagy elvetik az összes nem jelentéktelen üres helyet, és normalizálják a jelentős üres területet. Ez összhangban van az XAML-specifikáció alapértelmezett térbeli viselkedési javaslataival. Ez a viselkedés csak akkor számít, ha karaktersorozatokat ad meg az XAML-tartalom tulajdonságai között. A legegyszerűbben fogalmazva, az XAML a szóközöket, sortöréseket és tabulátorkaraktereket szóközökké alakítja, majd megőrzi az egyes szóközöket, ha azok egy összefüggő karakterlánc egyik végén találhatók. Az XAML térbeli kezelésének teljes magyarázatát ez a cikk nem ismerteti. További információ: Üres terület feldolgozása az XAML.

Korrektúra-bővítmények

A korrektúrakiterjesztések egy XAML nyelvi fogalom. Az attribútumszintaxis értékének megadásakor a kapcsos zárójelek ({ és }) a korrektúrakiterjesztés használatát jelzik. Ez a használat arra utasítja az XAML-feldolgozást, hogy elkerülje az attribútumértékek általános kezelését literális sztringként vagy sztringkonvertálható értékként.

A WPF-alkalmazások programozásában leggyakrabban használt korrektúrakiterjesztések az adatkötési kifejezésekhez használt Binding, valamint az erőforráshivatkozások StaticResource és DynamicResource. A korrektúrakiterjesztések használatával attribútumszintaxissal akkor is megadhat értékeket a tulajdonságokhoz, ha ez a tulajdonság általában nem támogatja az attribútumszintaxisokat. A korrektúrakiterjesztések gyakran használnak köztes kifejezéstípusokat olyan funkciók engedélyezéséhez, mint például az értékek elhalasztása vagy más, csak futásidőben jelen lévő objektumokra való hivatkozás.

Az alábbi korrektúra például az Style tulajdonság értékét attribútumszintaxissal állítja be. A Style tulajdonság a Style osztály egy példányát veszi fel, amelyet alapértelmezés szerint nem lehetett létrehozni attribútumszintaxis-sztringgel. Ebben az esetben azonban az attribútum egy adott korrektúrakiterjesztésre hivatkozik, StaticResource. A jelölő kiterjesztés feldolgozásakor egy olyan stílusra mutató hivatkozást ad vissza, amelyet korábban kulccsal azonosított erőforrásként hoztak létre egy erőforrás szótárban.

<Window x:Class="index.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="100" Width="300">
    <Window.Resources>
        <SolidColorBrush x:Key="MyBrush" Color="Gold"/>
        <Style TargetType="Border" x:Key="PageBackground">
            <Setter Property="BorderBrush" Value="Blue"/>
            <Setter Property="BorderThickness" Value="5" />
        </Style>
    </Window.Resources>
    <Border Style="{StaticResource PageBackground}">
        <StackPanel>
            <TextBlock Text="Hello" />
        </StackPanel>
    </Border>
</Window>

A kifejezetten a WPF-ben implementált XAML-hez tartozó összes korrektúrakiterjesztésre vonatkozó referencialistát lásd WPF XAML-bővítmények. A System.Xaml által definiált és a .NET XAML-implementációkhoz szélesebb körben elérhető korrektúrakiterjesztések listáját a XAML-névtér (x:) Nyelvi szolgáltatásokcímű témakörben talál. További információ a korrektúra-bővítmények fogalmairól: Korrektúra-bővítmények és WPF XAML.

Típuskonverterek

A rövid szakaszban az XAML szintaxisa azt állította, hogy az attribútum értékét sztringgel kell beállítani. A sztringek más objektumtípusokká vagy primitív értékekké alakításának alapszintű, natív kezelése magában a String típuson alapul, valamint bizonyos típusok, például DateTime vagy Urinatív feldolgozásán. Számos WPF-típus vagy ilyen típus tagjai azonban úgy bővítik az alapszintű sztringattribútum-feldolgozási viselkedést, hogy az összetettebb objektumtípusok példányai sztringként és attribútumként is megadhatók.

A Thickness struktúra egy olyan típus példája, amely az XAML-használatokhoz engedélyezett típuskonverzióval rendelkezik. Thickness beágyazott téglalapon belüli méréseket jelöl, és olyan tulajdonságok értékeként használatos, mint például a Margin. Ha Thicknesshelyez el egy típuskonvertert, az Thickness használó összes tulajdonságot könnyebb megadni az XAML-ben, mert attribútumként megadhatók. Az alábbi példa egy típuskonverzió és szintaxis segítségével ad meg értéket egy Marginszámára.

<Button Margin="10,20,10,30" Content="Click me"/>

Az előző attribútumszintaxis-példa egyenértékű az alábbi részletesebb szintaxis példával, ahol a Margin ehelyett egy Thickness objektumelemet tartalmazó tulajdonságelem-szintaxison keresztül van beállítva. A Thickness négy fő tulajdonsága attribútumként van beállítva az új példányon:

<Button Content="Click me">
    <Button.Margin>
        <Thickness Left="10" Top="20" Right="10" Bottom="30"/>
    </Button.Margin>
</Button>

Jegyzet

Korlátozott számú objektum is létezik, ahol a típuskonvertálás az egyetlen nyilvános módja annak, hogy egy tulajdonságot alosztály bevonása nélkül állítson be erre a típusra, mivel maga a típus nem rendelkezik paraméter nélküli konstruktorsal. Ilyen például a Cursor.

A típuskonvertálásról további információt TypeConverters és XAMLcímű témakörben talál.

Gyökérelemek és névterek

Az XAML-fájlnak csak egy gyökéreleme lehet, hogy jól formázott XML-fájlként és érvényes XAML-fájlként is legyen. Tipikus WPF-forgatókönyvekben egy gyökérelemet használ, amely a WPF-alkalmazásmodellben kiemelt jelentéssel bír (például egy oldal esetében Window vagy Page, külső szótárhoz pedig ResourceDictionary, vagy az alkalmazás definíciójához Application). Az alábbi példa egy WPF-lap tipikus XAML-fájljának gyökérelemét mutatja be a Pagegyökérelemével.

<Page x:Class="index.Page1"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      Title="Page1">

</Page>

A gyökérelem a xmlns és xmlns:xattribútumokat is tartalmazza. Ezek az attribútumok azt jelzik egy XAML-feldolgozónak, hogy mely XAML-névterek tartalmazzák a háttértípusok típusdefinícióit, amelyekre a korrektúra elemként hivatkozik. A xmlns attribútum kifejezetten az alapértelmezett XAML-névteret jelzi. Az alapértelmezett XAML-névtérben a korrektúra objektumelemeinek megadása előtag nélkül végezhető el. A legtöbb WPF-alkalmazási forgatókönyv esetében, és az SDK WPF-szakaszaiban szereplő példák szinte mindegyik példájához az alapértelmezett XAML-névtér a WPF-névtér http://schemas.microsoft.com/winfx/2006/xaml/presentation-re van leképezve. A xmlns:x attribútum egy további XAML-névteret jelez, amely leképezi az XAML nyelvi névteret http://schemas.microsoft.com/winfx/2006/xaml.

A névtávcső használati és leképezési hatókörének meghatározására szolgáló xmlns használata összhangban van az XML 1.0 specifikációjával. Az XAML-névszkópok különböznek az XML-névtávcsövektől, csak abban az esetben, ha egy XAML-névtávcső azt is jelenti, hogy a névtávcső elemeit típusok alapján kell alátámasztani, amikor a típusfeloldásról és az XAML elemzéséről van szó.

A xmlns attribútumok csak az egyes XAML-fájlok gyökéreleméhez szükségesek. xmlns definíciók a gyökérelem összes leszármazott elemére vonatkoznak (ez a viselkedés ismét összhangban van a xmlnsXML 1.0-s specifikációjával). xmlns attribútumok a gyökér alatti egyéb elemekre is érvényesek lesznek, és a definiáló elem minden leszármazott elemére érvényesek lesznek. Az XAML-névterek gyakori definíciója vagy újradefiniálása azonban nehezen olvasható XAML-jelölőstílust eredményezhet.

Az XAML-processzor WPF-implementációja olyan infrastruktúrát tartalmaz, amely tisztában van a WPF-magszerelvényekkel. A WPF-magszerelvények ismerten tartalmazzák azokat a típusokat, amelyek támogatják a WPF-leképezéseket az alapértelmezett XAML-névtérre. Ez a projekt buildfájljának, valamint a WPF buildelési és projektrendszereinek részét képező konfigurációval engedélyezve van. Ezért elegendő az XAML névtérként megadni az alapértelmezett xmlns, hogy a WPF szerelvényekből származó XAML-elemekre hivatkozhassunk.

Az x: előtag

Az előző gyökérelem-példában a x: előtaggal képezték le az XAML-névtér http://schemas.microsoft.com/winfx/2006/xaml, amely az XAML nyelvi szerkezeteket támogató dedikált XAML-névtér. Ez a x: előtag az XAML-névtér leképezésére szolgál a projektek sablonjaiban, példákban és dokumentációban az SDK-ban. Az XAML nyelv XAML-névtere számos olyan programozási szerkezetet tartalmaz, amelyeket gyakran fog használni az XAML-ben. Az alábbiakban felsoroljuk a leggyakrabban használt x: előtag-programozási szerkezeteket:

  • x:Key: Egy egyedi kulcsot állít be minden erőforráshoz egy ResourceDictionary-ban (vagy hasonló szótári fogalmak más keretrendszerekben). x:Key valószínűleg a x: használatok 90 százalékát teszi ki egy tipikus WPF-alkalmazás jelölésében.

  • x:Class: Megadja annak az osztálynak a CLR-névterét és osztálynevét, amely egy XAML-lap mögötti kódját biztosítja. A WPF programozási modell alapján a kód mögötti támogatáshoz szükséges egy ilyen osztály, és ezért szinte mindig látni lehet, hogy a x: hozzá van rendelve, még akkor is, ha nincsenek erőforrások.

  • x:Name: Az objektumelem feldolgozása után a futtatókörnyezeti kódban létező példány futásidejű objektumnevét adja meg. Általában a WPF által definiált egyenértékű tulajdonságot használja x:Name. Az ilyen tulajdonságok kifejezetten egy CLR-háttértulajdonságra vannak megfeleltetve, így kényelmesebbek az alkalmazás programozásához, ahol gyakran használ futásidejű kódot az inicializált XAML elnevezett elemeinek megkereséséhez. A leggyakoribb ilyen tulajdonság a FrameworkElement.Name. Akkor is használhatja x:Name, ha az egyenértékű WPF keretrendszerszintű Name tulajdonság nem támogatott egy adott típusban. Ez bizonyos animációs forgatókönyvekben fordul elő.

  • x:Static: Olyan hivatkozást engedélyez, amely olyan statikus értéket ad vissza, amely egyébként nem XAML-kompatibilis tulajdonság.

  • x:Type: Típusnév alapján Type hivatkozást hoz létre. Ez olyan attribútumok megadására szolgál, amelyek Typehasználnak (például Style.TargetType), bár a tulajdonság gyakran natív sztring–Type átalakítással rendelkezik, oly módon, hogy az x:Type formázási kiterjesztés használata nem kötelező.

A x: előtagban/XAML névtérben további programozási szerkezetek találhatók, amelyek nem olyan gyakoriak. További információ: XAML-névtér (x:) nyelvi szolgáltatások.

Egyéni előtagok és egyéni típusok

Saját egyéni összeállításokhoz vagy a WPF magján kívüli összeállításokhoz, például a PresentationCore, a PresentationFramework és a WindowsBase, az összeállítást egy egyéni xmlns leképezés részeként adhatja meg. Ezután hivatkozhat típusokra az adott szerelvényből az XAML-ben, amennyiben a típus megfelelően van implementálva a megkísérelt XAML-használatok támogatásához.

Az alábbiakban egy egyszerű példa látható arra, hogyan működnek az egyéni előtagok a XAML jelölésben. A custom előtag a gyökérelem címkéjében van definiálva, és az alkalmazással csomagolt és elérhető adott szerelvényre van leképezve. Ez a szerelvény egy NumericUpDowntípust tartalmaz, amely az általános XAML-használat támogatására, valamint egy osztályöröklés használatára van implementálva, amely lehetővé teszi a beillesztését ezen a ponton egy WPF XAML-tartalommodellben. Ennek a NumericUpDown vezérlőelemnek egy példánya objektumelemként van deklarálva, az előtag használatával, hogy egy XAML-elemző tudja, melyik XAML-névtér tartalmazza a típust, és ezért hol található a háttérszerelvény, amely tartalmazza a típusdefiníciót.

<Page
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:custom="clr-namespace:NumericUpDownCustomControl;assembly=CustomLibrary"
    >
  <StackPanel Name="LayoutRoot">
    <custom:NumericUpDown Name="numericCtrl1" Width="100" Height="60"/>
...
  </StackPanel>
</Page>

További információért az XAML egyéni típusairól lásd: XAML és az egyéni osztályok a WPF-hez.

További információ arról, hogyan kapcsolódnak az XML- és kód-névterek az összeállításokban: XAML-névterek és névtérleképezés a WPF XAML-hez.

Események és XAML-kód mögött

A legtöbb WPF-alkalmazás XAML-jelölésből és kód mögötti állományból áll. A projekten belül az XAML .xaml fájlként van megírva, és a Microsoft Visual Basic vagy a C# mint CLR-nyelv használatos a kód-behind fájl megírására. Ha egy XAML-fájlt a WPF-programozási és alkalmazásmodellek részeként állít össze, a rendszer egy XAML-fájl XAML-kód mögötti fájljának helyét azonosítja úgy, hogy megad egy névteret és osztályt az XAML gyökérelemének x:Class attribútumaként.

Az eddigi példákban több gombot is láthatott, de ezek közül egyiknek sem volt még logikai viselkedése hozzájuk társítva. Az objektumelemek viselkedésének hozzáadására szolgáló elsődleges alkalmazásszintű mechanizmus az elemosztály meglévő eseményének használata, valamint egy adott kezelő írása ahhoz az eseményhez, amelyet az esemény futásidőben történő indításakor hívunk meg. Az esemény nevét és a használni kívánt kezelő nevét a korrektúra határozza meg, míg a kezelőt megvalósító kód a mögöttes kódban van definiálva.

<Page x:Class="ExampleNamespace.ExamplePage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel>
        <Button Click="Button_Click">Click me</Button>
    </StackPanel>
</Page>
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace ExampleNamespace;

public partial class ExamplePage : Page
{
    public ExamplePage() =>
        InitializeComponent();

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        var buttonControl = (Button)e.Source;
        buttonControl.Foreground = Brushes.Red;
    }
}
Class ExamplePage
    Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
        Dim buttonControl = DirectCast(e.Source, Button)
        buttonControl.Foreground = Brushes.Red
    End Sub
End Class

Figyelje meg, hogy a mögöttes kódfájl a CLR-névteret ExampleNamespace használja (a névtér nem látható a Visual Basicben), és részleges osztályként deklarálja a ExamplePage a névtéren belül. Ez a x:Class attribútumértékével párhuzamos a ExampleNamespaceesetében. ExamplePage, amelyet a jelölőnyelv gyökere adott meg. A WPF jelölés-fordító egy részleges osztályt hoz létre minden lefordított XAML-fájlhoz, azáltal, hogy az osztályt a gyökérelem típusából származtatja. Ha olyan kód mögötti kódot ad meg, amely ugyanazt a részleges osztályt is meghatározza, az eredményként kapott kód a lefordított alkalmazás azonos névterén és osztályán belül lesz kombinálva.

Fontos

A Visual Basicben a gyökérnévtér az XAML-hez és a mögöttes kódhoz is kapcsolódik. Csak beágyazott névterek láthatók. Ez a cikk a C# projekt XAML-jét mutatja be.

A WPF-ben a kód mögötti programozás követelményeiről további információt a WPFkódolási, eseménykezelői és részleges osztálykövetelményei című témakörben talál.

Ha nem szeretne külön kód mögötti fájlt létrehozni, a kódot egy XAML-fájlba is beágyazhatja. A beágyazott kód azonban kevésbé sokoldalú technika, amely jelentős korlátozásokkal rendelkezik. További információ: Code-Behind és XAML a WPF.

Irányított események

A WPF szempontjából alapvető eseményjellemző a továbbított esemény. Az irányított események lehetővé teszik, hogy az elemek egy másik elem által létrehozott eseményt kezeljenek, feltéve, hogy az elemek fakapcsolaton keresztül kapcsolódnak egymáshoz. Ha XAML-attribútummal rendelkező eseménykezelést ad meg, az irányított esemény bármely elemen meghallgatható és kezelhető, beleértve azokat az elemeket is, amelyek nem sorolják fel az adott eseményt az osztálytagok táblájában. Ez úgy érhető el, hogy az eseménynév attribútumot a tulajdonos osztály nevével kvalifikálja. A szülő StackPanel a folyamatban lévő StackPanel / Button példában például regisztrálhat egy kezelőt a gyermekelem gomb Click eseményéhez az StackPanel objektumelem Button.Click attribútumának megadásával, attribútumértékként a kezelő nevével. További információért olvasd el az Irányított események áttekintéserészt.

Elnevezett elemek

Alapértelmezés szerint az objektumgráfban XAML objektumelem feldolgozásával létrehozott objektumpéldány nem rendelkezik egyedi azonosítóval vagy objektumhivatkozással. Ezzel szemben, ha kódban hív meg egy konstruktort, szinte mindig a konstruktor eredményével állít be egy változót a létrehozott példányra, hogy a kód későbbi részében hivatkozzon a példányra. Ha szabványosított hozzáférést szeretne biztosítani a korrektúradefinícióval létrehozott objektumokhoz, az XAML határozza meg a x:Name attribútumot. A x:Name attribútum értékét bármely objektumelemen beállíthatja. A mögöttes kódban a választott azonosító egyenértékű a létrehozott példányra hivatkozó példányváltozóval. Az elnevezett elemek minden tekintetben úgy működnek, mintha objektumpéldányok lennének (a név erre a példányra hivatkozik), és a mögöttes kód hivatkozhat a megnevezett elemekre az alkalmazás futásidejű interakcióinak kezeléséhez. A példányok és a változók közötti kapcsolatot a WPF XAML korrektúrafordítója valósítja meg, és pontosabban olyan funkciókat és mintákat tartalmaz, mint például a InitializeComponent, amelyeket ebben a cikkben nem tárgyalunk részletesen.

A WPF keretrendszerszintű XAML-elemek örökölnek egy Name tulajdonságot, amely egyenértékű az XAML által definiált x:Name attribútummal. Egyes más osztályok tulajdonságszintű egyenértékűségeket is biztosítanak a x:Nameszámára, amelyet általában Name tulajdonságként is definiálnak. Általánosságban elmondható, hogy ha nem talál Name tulajdonságot a tagtáblában a választott elemhez/típushoz, használja inkább a x:Name. A x:Name értékek, egy XAML elem azonosítóját adják meg, amely futtatáskor is használható, adott alrendszerek vagy segédprogramok, mint például a FindNameáltal.

Az alábbi példa beállít egy Name-t egy StackPanel elemre. Ezután az adott StackPanel-ben lévő Button kezelő a Nameáltal beállított példányhivatkozás buttonContainer segítségével hivatkozik a StackPanel-re.

<StackPanel Name="buttonContainer">
    <Button Click="RemoveThis_Click">Click to remove this button</Button>
</StackPanel>
private void RemoveThis_Click(object sender, RoutedEventArgs e)
{
    var element = (FrameworkElement)e.Source;
    
    if (buttonContainer.Children.Contains(element))
        buttonContainer.Children.Remove(element);
}
Private Sub RemoveThis_Click(sender As Object, e As RoutedEventArgs)
    Dim element = DirectCast(e.Source, FrameworkElement)

    If buttonContainer.Children.Contains(element) Then
        buttonContainer.Children.Remove(element)
    End If
End Sub

A változókhoz hasonlóan a példány XAML-nevét is a hatókör fogalma szabályozza, hogy a nevek egyediek legyenek egy előrejelezhető hatókörön belül. A lapot meghatározó elsődleges jelölés egyedi XAML-névteret jelöl, amelynek határa a lap gyökéreleme. Más korrektúraforrások azonban futtatáskor is kezelhetik a lapokat, például stílusokon belüli stílusokat vagy sablonokat, és az ilyen korrektúraforrások gyakran rendelkeznek saját XAML-névszkópokkal, amelyek nem feltétlenül kapcsolódnak a lap XAML-névszkópjához. A x:Name és az XAML-névszkópokról további információt Name, x:Name Directivevagy WPF XAML Namescopescímű cikkben talál.

Csatolt tulajdonságok és csatolt események

Az XAML olyan nyelvi funkciót határoz meg, amely lehetővé teszi bizonyos tulajdonságok vagy események megadását bármely elemen, még akkor is, ha a tulajdonság vagy esemény nem szerepel a típus definíciójában a beállított elemhez. A szolgáltatás tulajdonságverzióját csatolt tulajdonságnak, az eseményverziót csatolt eseménynek nevezzük. Elméletileg úgy tekinthet a csatolt tulajdonságokra és a csatolt eseményekre, mint globális tagokra, amelyek bármely XAML-elemen/objektumpéldányon beállíthatók. Ennek az elemnek/osztálynak vagy nagyobb infrastruktúrának azonban támogatnia kell egy háttértulajdonság-tárolót a csatolt értékekhez.

Az XAML-ben a csatolt tulajdonságokat általában attribútumszintaxissal használják. Az attribútumszintaxisban egy csatolt tulajdonságot a következő formában kell megadnia: ownerType.propertyName.

Felületesen ez egy tulajdonságelem-használathoz hasonlít, de ebben az esetben a megadott ownerType mindig más típusú, mint az objektumelem, amelyben a csatolt tulajdonság be van állítva. ownerType az a típus, amely biztosítja az XAML-processzor által a csatolt tulajdonságérték lekéréséhez vagy beállításához szükséges kiegészítő módszereket.

A csatolt tulajdonságok leggyakoribb forgatókönyve az, hogy lehetővé teszik a gyermekelemeknek, hogy tulajdonságértéket átadjanak a szülőelemüknek.

Az alábbi példa a csatolt DockPanel.Dock tulajdonságot szemlélteti. A DockPanel osztály határozza meg a DockPanel.Dock lekérdezőit, és birtokolja a csatolt tulajdonságot. A DockPanel osztály olyan logikát is tartalmaz, amely iterálja a gyermekelemeket, és kifejezetten ellenőrzi az egyes elemeket a DockPanel.Dockmegadott értékén. Ha talál egy értéket, a rendszer ezt az értéket használja az elrendezés során a gyermekelemek elhelyezéséhez. A DockPanel.Dock csatolt tulajdonság és a helymeghatározó képesség használata valójában a DockPanel osztály motiváló forgatókönyvének része.

<DockPanel>
    <Button DockPanel.Dock="Left" Width="100" Height="20">I am on the left</Button>
    <Button DockPanel.Dock="Right" Width="100" Height="20">I am on the right</Button>
</DockPanel>

A WPF-ben a legtöbb vagy az összes csatolt tulajdonság függőségi tulajdonságként is implementálva van. További információ: Csatolt tulajdonságok áttekintése.

A csatolt események az attribútumszintaxis hasonló ownerType.eventName formáját használják. A nem csatolt eseményekhez hasonlóan az XAML-ben egy csatolt esemény attribútumértéke határozza meg annak a kezelőmetódusnak a nevét, amelyet az esemény elemen való kezelésekor hív meg. A WPF XAML-ben a csatolt eseményhasználatok kevésbé gyakoriak. További információ: Csatolt események áttekintése.

Alaptípusok

A mögöttes WPF XAML és XAML-névtere olyan típusok gyűjteménye, amelyek megfelelnek az XAML CLR-objektumoknak és jelölőelemeknek. Nem minden osztály rendelhető elemekhez. Az absztrakciós osztályok, például a ButtonBaseés bizonyos nem absztrakt alaposztályok a CLR objektummodellben való örökléshez használatosak. Az alaposztályok, beleértve az absztraktokat is, továbbra is fontosak az XAML-fejlesztés szempontjából, mivel az egyes konkrét XAML-elemek a hierarchiában lévő egyes alaposztályokból öröklik a tagokat. Ezek a tagok gyakran tartalmaznak olyan tulajdonságokat, amelyek attribútumként állíthatók be az elemen, vagy amelyek kezelhetők. FrameworkElement a WPF konkrét alapszintű felhasználói felületi osztálya a WPF keretrendszer szintjén. A felhasználói felület tervezésekor különböző alakzatokat, paneleket, dekorátorokat vagy vezérlőosztályokat fog használni, amelyek mindegyike FrameworkElementszármazik. A kapcsolódó alaposztály, FrameworkContentElementtámogatja a dokumentumorientált elemeket, amelyek jól működnek egy folyamatelrendezési bemutatóhoz, olyan API-kat használva, amelyek szándékosan tükrözik az API-kat a FrameworkElement. Az elemszintű attribútumok és a CLR-objektummodellek kombinációja olyan közös tulajdonságokat biztosít, amelyek a legtöbb konkrét XAML-elemen beállíthatók, függetlenül az adott XAML-elemtől és annak alapjául szolgáló típustól.

Biztonság

Az XAML egy olyan korrektúranyelv, amely közvetlenül az objektumok példányosítását és végrehajtását jelöli. Ezért az XAML-ben létrehozott elemek ugyanúgy használhatják a rendszererőforrásokat (például hálózati hozzáférést, fájlrendszer IO-t), mint az alkalmazáskód. Az XAML ugyanazokkal a hozzáféréssel rendelkezik a rendszererőforrásokhoz, mint az üzemeltetési alkalmazás.

Kódelérési biztonság (CAS) a WPF-ben

A .NET-keretrendszertől eltérően a .NET-hez készült WPF nem támogatja a CAS-t. További információ: Kódhozzáférés biztonsági különbségei.

XAML betöltése kódból

Az XAML az összes felhasználói felület definiálására használható, de néha az XAML-ben is célszerű csak a felhasználói felület egy részét definiálni. Ez a képesség a következő lehetőségekre használható:

  • Részleges testreszabás engedélyezése.
  • A felhasználói felület adatainak helyi tárolása.
  • Üzleti objektum modellezése.

Ezeknek a forgatókönyveknek a kulcsa a XamlReader osztály és annak Load metódusa. A bemenet egy XAML-fájl, a kimenet pedig egy olyan objektum, amely az adott korrektúra alapján létrehozott objektumok futásidejű fáját jelöli. Ezután beszúrhatja az objektumot egy másik objektum tulajdonságának, amely már létezik az alkalmazásban. Ha a tulajdonság a tartalommodellben található, és olyan megjelenítési képességekkel rendelkezik, amelyek értesítik a végrehajtó motort arról, hogy új tartalom lett hozzáadva az alkalmazáshoz, egyszerűen módosíthatja a futó alkalmazás tartalmát az XAML dinamikus betöltésével.

Lásd még: