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


Jelölési kiterjesztések és WPF XAML

Ez a témakör bemutatja az XAML jelölőbővítményeinek fogalmát, beleértve azok szintaxisi szabályait, célját és az azok alapjául szolgáló osztályobjektum-modellt. A korrektúrakiterjesztések az XAML nyelv és az XAML-szolgáltatások .NET-implementációjának általános jellemzői. Ez a témakör kifejezetten a WPF XAML-ben használható korrektúrakiterjesztéseket ismerteti.

XAML-processzorok és korrektúrakiterjesztések

Általánosságban elmondható, hogy az XAML-elemzők egy attribútumértéket literális sztringként értelmezhetnek, amely primitívsé alakítható, vagy valamilyen módon objektummá alakítható. Az egyik ilyen eszköz egy típuskonverterre való hivatkozás; ezt a TypeConverters és az XAML témakör ismerteti. Vannak azonban olyan forgatókönyvek, amelyekben eltérő viselkedésre van szükség. Egy XAML-processzor például arra utasítható, hogy egy attribútum értéke ne eredményezjen új objektumot az objektumgráfban. Ehelyett az attribútumnak olyan objektumgráfot kell eredményeznie, amely a gráf egy másik részén már létrehozott objektumra vagy statikus objektumra hivatkozik. Egy másik forgatókönyv az, hogy egy XAML-processzor olyan szintaxis használatára utasítható, amely nem alapértelmezett argumentumokat biztosít egy objektum konstruktorának. Ezek azok a forgatókönyvek, amelyekben egy korrektúrakiterjesztés biztosíthatja a megoldást.

Alapszintű jelölő kiterjesztés szintaxisa

Egy korrektúrakiterjesztés implementálható az attribútumhasználat tulajdonságainak, a tulajdonságelem-használat tulajdonságainak vagy mindkettőnek az értékeinek megadásához.

Attribútumérték megadásakor a jelölőkiterjesztés-szekvenciának a XAML-processzor általi megkülönböztetésére szolgáló szintaxis a nyitó és záró kapcsos zárójelek ({ és }) jelenlétében rejlik. A jelölőkiterjesztés típusát a karakterlánc kifejezés azonosítja közvetlenül a kapcsos zárójel megnyitása után.

A tulajdonságelem szintaxisa esetén a korrektúrakiterjesztés vizuálisan megegyezik a tulajdonságelem-érték megadásához használt többi elemével: egy XAML-elemdeklaráció, amely elemként hivatkozik a korrektúrakiterjesztési osztályra, szögletes zárójelek közé (<>).

XAML-Defined Jelölő kiterjesztések

Számos korrektúrakiterjesztés létezik, amelyek nem az XAML WPF-implementációjára vonatkoznak, hanem az XAML belső elemeinek vagy funkcióinak nyelvi implementációi. Ezek a korrektúrakiterjesztések az általános .NET-keretrendszer XAML-szolgáltatásainak részeként a System.Xaml szerelvényben implementálódnak, és az XAML nyelv XAML-névterén belül találhatók. A gyakori jelöléshasználat szempontjából ezek a jelöléskiterjesztések általában a x: előtag alapján azonosíthatók. Az MarkupExtension alaposztály (a System.Xaml-ben is definiálva) azt a mintát adja meg, amelyet az összes korrektúrakiterjesztésnek használnia kell ahhoz, hogy az XAML-olvasók és az XAML-írók támogathassák, beleértve a WPF XAML-t is.

  • x:Type biztosítja a névvel ellátott típushoz tartozó Type objektumot. Ezt a lehetőséget leggyakrabban stílusokban és sablonokban használják. További részletekért lásd : x:Típus korrektúrakiterjesztés.

  • x:Static statikus értékeket hoz létre. Az értékek olyan érték típusú kódentitásokból származnak, amelyek nem közvetlenül a céltulajdonság értékének típusa, de kiértékelhetők erre a típusra. További részletekért lásd : x:Static Markup Extension.

  • x:Null null tulajdonság értékeként adja meg, és attribútumokhoz vagy tulajdonságelem-értékekhez is használható. További részletekért lásd x:Null jelölési kiterjesztés.

  • x:Array Támogatja az általános tömbök létrehozását az XAML szintaxisban, olyan esetekben, amikor a WPF alapelemek és vezérlőmodellek által biztosított gyűjteménytámogatás szándékosan nem használatos. További részletekért lásd : x:Tömbjelölési bővítmény.

Megjegyzés:

Az x: előtag az XAML nyelv belső elemeinek tipikus XAML-névtérleképezéséhez használatos egy XAML-fájl vagy előállítás gyökérelemében. A WPF-alkalmazásokhoz készült Visual Studio-sablonok például XAML-fájlt hoznak létre ezzel a x: térképezéssel. A saját XAML-névtérleképezésben másik előtag-jogkivonatot is választhat, de ez a dokumentáció feltételezi az alapértelmezett x: leképezést az XAML-nyelv XAML-névterének meghatározott részét képező entitások azonosítására, szemben a WPF alapértelmezett névterével vagy más, nem egy adott keretrendszerhez kapcsolódó XAML-névtérrel.

WPF-Specific Jelölőkiterjesztések

A WPF-programozásban leggyakrabban használt korrektúrakiterjesztések az erőforráshivatkozásokat (StaticResource és ), valamint DynamicResourceaz adatkötést (Binding) támogató bővítmények.

  • StaticResource egy tulajdonság értékét egy már definiált erőforrás értékének helyettesítésével adja meg. A StaticResource kiértékelés végső soron XAML betöltési időben történik, és futásidőben nem fér hozzá az objektumgráfhoz. További részletekért lásd: StaticResource Markup Extension.

  • DynamicResource egy tulajdonság értékét úgy adja meg, hogy ezt az értéket egy erőforrás futásidejű hivatkozásává teszi. A dinamikus erőforrás-referenciák minden alkalommal új kereséseket kényszerítenek ki, amikor egy ilyen erőforráshoz hozzáférnek, és futásidőben hozzáférnek az objektumgráfhoz. A DynamicResource koncepciót a WPF tulajdonságrendszer függőségi tulajdonságai és a kiértékelt kifejezések támogatják a hozzáférés elérése érdekében. Ezért csak függőségi tulajdonság célként használható DynamicResource . További részletekért lásd: DynamicResource Markup Extension.

  • Binding egy tulajdonság adathoz kötött értékét adja meg a szülőobjektumra futtatáskor érvényes adatkörnyezet használatával. Ez a korrektúrakiterjesztés viszonylag összetett, mivel jelentős beágyazott szintaxist tesz lehetővé egy adatkötés megadásához. További részletekért lásd a Kötési korrektúra bővítményt.

  • RelativeSource forrásinformációkat biztosít egy Binding olyan objektumhoz, amely több lehetséges kapcsolat között navigálhat a futásidejű objektumfában. Ez speciális forráskezelést biztosít a többfelhasználós sablonokban létrehozott vagy kódban létrehozott kötésekhez a környező objektumfa teljes ismerete nélkül. További részletekért lásd: RelativeSource MarkupExtension.

  • TemplateBinding lehetővé teszi, hogy a vezérlősablonok olyan sablontulajdonságok értékeit használják, amelyek a sablont használó osztály objektummodell által definiált tulajdonságaiból származnak. Más szóval a sablondefiníció tulajdonsága csak a sablon alkalmazása után tud hozzáférni egy olyan környezethez, amely csak a sablon alkalmazása után létezik. További részletekért lásd: TemplateBinding Markup Extension. További információk a TemplateBinding gyakorlati használatáról a ControlTemplates bemutató stílusozása című cikkben találhatók.

  • ColorConvertedBitmap egy viszonylag fejlett képalkotó forgatókönyvet támogat. Részletekért lásd: ColorConvertedBitmap Markup Extension.

  • ComponentResourceKey és ThemeDictionary támogatja az erőforrás-keresés szempontjait, különösen az egyéni vezérlőkkel csomagolt erőforrások és témák esetében. További információ: ComponentResourceKey Markup Extension, ThemeDictionary Markup Extension vagy Control Authoring Overview.

*Bővítményosztályok

Az általános XAML-nyelv és a WPF-specifikus korrektúrakiterjesztések esetében az egyes korrektúrakiterjesztések viselkedését egy XAML-processzor azonosítja egy *Extension olyan osztályon keresztül, amelyből MarkupExtensionszármazik, és biztosítja a ProvideValue metódus implementálását. Ez a módszer minden bővítményen megadja a korrektúrakiterjesztés kiértékelésekor visszaadott objektumot. A visszaadott objektum kiértékelése általában a jelölőkiterjesztésnek átadott különböző sztring tokenek alapján történik.

Az StaticResourceExtension osztály például biztosítja az alapvető implementációt a tényleges erőforráskereséshez, így annak ProvideValue implementációja visszaadja a kért objektumot, és az adott implementáció bemenete egy sztring, amely használható az erőforrás x:Key keresésére. A megvalósítás részleteinek nagy része nem lényeges, ha meglévő korrektúrabővítményt használ.

Egyes jelölőkiterjesztések nem használnak sztring token argumentumokat. Ennek az az oka, hogy statikus vagy konzisztens értéket adnak vissza, vagy azért, mert a visszaadandó érték kontextusa a paraméteren áthaladó egyik szolgáltatáson keresztül serviceProvider érhető el.

Az *Extension elnevezési minta a kényelem és a konzisztencia érdekében használható. Nem szükséges, hogy egy XAML-processzor azonosítsa az osztályt egy korrektúrakiterjesztés támogatásaként. Mindaddig, amíg a kódbázis tartalmazza a System.Xaml-t, és a .NET-keretrendszer XAML-szolgáltatásainak implementációit használja, az a feltétel az XAML jelölési bővítményként való elismeréshez, hogy a MarkupExtension osztályból vagy interfészből származzon, és támogassa a konstrukciós szintaxist. A WPF olyan jelöléskiterjesztés-engedélyező osztályokat határoz meg, amelyek nem követik az *Extension elnevezési mintát, például Binding. Ennek általában az az oka, hogy az osztály a tiszta korrektúra-bővítmények támogatásán túl is támogatja a forgatókönyveket. Ebben az esetben az osztály támogatja az objektum metódusaihoz és tulajdonságaihoz való futásidejű hozzáférést olyan forgatókönyvek esetében Binding, amelyeknek semmi köze az XAML-hez.

Az inicializálási szöveg bővítményosztály-értelmezése

A jelölőbővítmény nevét követő és a kapcsos zárójelben lévő sztring tokeneket egy XAML-processzor az alábbi módok egyikével értelmezi:

  • A vessző mindig az egyes tokenek elválasztóját vagy határolóját jelöli.

  • Ha az egyes különálló jogkivonatok nem tartalmaznak egyenlőségjeleket, minden jogkivonat konstruktor argumentumként lesz kezelve. Minden konstruktorparamétert az aláírás által várt típusként kell megadni, és az aláírás által elvárt megfelelő sorrendben.

    Megjegyzés:

    Az XAML-processzornak meg kell hívnia a párok számának argumentumszámával egyező konstruktort. Ezért ha egyéni korrektúrabővítményt implementál, ne adjon meg több konstruktort azonos argumentumszámmal. A viselkedés arra az esetre, ha egy XAML-processzor több azonos paraméterszámú jelölőkiterjesztés-konstruktor útvonallal találkozik, nincs meghatározva, de számítani lehet arra, hogy a XAML-processzor kivételt dobhat a használatkor, ha ez a helyzet fennáll a jelölőkiterjesztés típusdefinícióban.

  • Ha az egyes különálló tokenek egyenlőségjelet tartalmaznak, akkor a XAML-processzor először meghívja a paraméter nélküli konstruktort a jelöléskiterjesztéshez. Ezután a rendszer minden név=értékpárt a korrektúrakiterjesztésen létező tulajdonságnévként és a tulajdonsághoz rendelendő értékként értelmez.

  • Ha a konstruktor viselkedése és a tulajdonságbeállítás viselkedése egy korrektúrakiterjesztésben párhuzamos eredményt ad, nem számít, hogy melyik viselkedést használja. Gyakrabban használják a tulajdonságérték= párokat olyan korrektúrakiterjesztésekhez, amelyek több beállítási tulajdonságot is használnak, ha csak azért, mert szándékosabbá teszi a korrektúrát, és kevésbé valószínű, hogy véletlenül transzponálná a konstruktorparamétereket. (Ha tulajdonság=érték párokat ad meg, ezek a tulajdonságok bármilyen sorrendben lehetnek.) Emellett nincs garancia arra, hogy egy korrektúrakiterjesztés olyan konstruktorparamétert biztosít, amely minden egyes beállítási tulajdonságát beállítja. Például Binding egy korrektúrakiterjesztés, amely számos tulajdonsággal rendelkezik, amelyektulajdonságérték-formában vannak beállítva a = keresztül, de Binding csak két konstruktort támogatnak: egy paraméter nélküli konstruktort, és egyet, amely beállít egy kezdeti útvonalat.

  • A literális vessző nem adható át korrektúrakiterjesztésnek feloldás nélkül.

Escape Sequences és Markup Extensions

Az XAML-processzorok attribútumkezelése a kapcsos zárójeleket használja a korrektúrakiterjesztések sorozatának jelzéseként. Ha szükséges, egy literális kapcsos zárójel karakterértéket is előállíthat úgy, hogy egy üres kapcsos zárójelpárt, majd a literális kapcsos zárójelet tartalmazó feloldósorozatot ad meg. Lásd: {} Escape Sequence – Korrektúrakiterjesztés.

Korrektúra-bővítmények beágyazása az XAML-használatban

Több korrektúrabővítmény beágyazása támogatott, és minden korrektúrakiterjesztést a rendszer először a legmélyebbre értékel. Vegyük például a következő használatot:

<Setter Property="Background"
  Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" />

Ebben a használatban a függvény először kiértékeli az x:Static utasítást, és egy sztringet ad vissza. Ez a karakterlánc lesz az argumentum a(z) DynamicResource függvényhez.

Korrektúrakiterjesztések és tulajdonságelem-szintaxis

Tulajdonságelem-értéket kitöltő objektumelemként használva a korrektúrakiterjesztési osztály vizuálisan megkülönböztethetetlen az XAML-ben használható tipikus, típusalapú objektumelemtől. A tipikus objektumelem és a korrektúrakiterjesztés közötti gyakorlati különbség az, hogy a korrektúrakiterjesztést gépelt értékre értékelik ki, vagy kifejezésként késleltetik. Ezért a jelölőbővítmény tulajdonságértékeinek esetleges típushibáinak mechanizmusai eltérőek lesznek, hasonlóan ahhoz, ahogyan a késői kötött tulajdonságot más programozási modellekben kezelik. A rendszer kiértékel egy közönséges objektumelemet a típusegyeztetés szempontjából az XAML elemzésekor beállított céltulajdonsághoz.

A legtöbb korrektúrakiterjesztés, ha az objektumelem szintaxisában egy tulajdonságelem kitöltésére szolgál, nem tartalmaz tartalmat vagy további tulajdonságelemszintaxisokat. Így bezárja az objektumelem címkéjét, és nem ad meg gyermekelemeket. Amikor egy XAML-processzor bármilyen objektumelemet észlel, meghívja az osztály konstruktorát, amely példányosítja az elemzett elemből létrehozott objektumot. A korrektúrakiterjesztési osztály nem különbözik egymástól: ha azt szeretné, hogy a korrektúrakiterjesztés használható legyen az objektumelem szintaxisában, meg kell adnia egy paraméter nélküli konstruktort. Néhány meglévő korrektúrakiterjesztés rendelkezik legalább egy szükséges tulajdonságértékel, amelyet meg kell adni a hatékony inicializáláshoz. Ha igen, ez a tulajdonságérték általában tulajdonságattribútumként van megadva az objektumelemen. Az XAML-névtér (x:) nyelvi jellemzők és a WPF XAML-kiterjesztések referenciaoldalain meg lesznek jelölve a kötelező tulajdonságok (és a kötelező tulajdonságok nevei) a jelölőnyelvi kiterjesztéseknél. A referenciaoldalak azt is megjegyzik, hogy az objektumelem szintaxisa vagy az attribútumszintaxis nem engedélyezett az adott korrektúrakiterjesztések esetében. Fontos eset az x:Tömbjelölési bővítmény, amely nem támogatja az attribútumszintaxist, mert a tömb tartalmát tartalomként kell megadni a címkézésben. A tömb tartalma általános objektumként van kezelve, ezért az attribútum alapértelmezett típuskonvertere nem valósítható meg. Az x:Array Markup extension paramétert type is igényel.

Lásd még