Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A közös nyelvi futtatókörnyezeti (CLR) keretrendszerekben implementált XAML lehetővé teszi egyéni osztály vagy struktúra definiálásának lehetőségét bármely közös nyelvi futtatókörnyezeti (CLR) nyelven, majd az adott osztályhoz való hozzáféréshez XAML-korrektúra használatával. A Windows Presentation Foundation (WPF) által definiált típusok és az egyéni típusok ugyanazon a korrektúrafájlon belül használhatók, általában az egyéni típusok XAML-névtérelőtagra való leképezésével. Ez a témakör azokat a követelményeket ismerteti, amelyeknek egy egyéni osztálynak meg kell felelnie ahhoz, hogy XAML-elemként használható legyen.
Egyéni osztályok alkalmazásokban vagy Assembly-kben
Az XAML-ben használt egyéni osztályok kétféleképpen határozhatók meg: a mögöttes kódban vagy az elsődleges Windows Presentation Foundation (WPF) alkalmazást előállító más kódban, vagy egy külön szerelvény osztályaként, például egy végrehajtható vagy egy osztálytárként használt DLL-ben. E megközelítések mindegyike különleges előnyökkel és hátrányokkal rendelkezik.
Az osztálytárak létrehozásának előnye, hogy az ilyen egyéni osztályok számos különböző lehetséges alkalmazásban megoszthatóak. A különálló kódtár megkönnyíti az alkalmazások verziószámozási problémáinak szabályozását, és leegyszerűsíti egy olyan osztály létrehozását, amelyben a kívánt osztályhasználat gyökérelemként szerepel az XAML-lapon.
Az egyéni osztályok alkalmazásbeli definiálásának előnye, hogy ez a technika viszonylag egyszerű, és minimálisra csökkenti az üzembe helyezéssel és teszteléssel kapcsolatos problémákat, amikor a fő alkalmazáson kívül különálló szerelvényeket vezet be.
Akár ugyanabban a szerelvényben, akár más szerelvényben van definiálva, az egyéni osztályokat le kell képezni a CLR-névtér és az XML-névtér között annak érdekében, hogy az XAML-ben elemekként lehessen használni. Lásd: XAML-névterek és a WPF XAML névtérleképezése.
Egyéni osztály XAML-elemként való követelményei
Az objektumelemként történő példányosításhoz az osztálynak meg kell felelnie a következő követelményeknek:
Az egyéni osztálynak nyilvánosnak kell lennie, és támogatnia kell egy alapértelmezett (paraméter nélküli) nyilvános konstruktort. (A struktúrákkal kapcsolatos megjegyzésekért lásd a következő szakaszt.)
Az egyéni osztály nem lehet beágyazott osztály. A beágyazott osztályok és az általános CLR-használat szintaxisában szereplő "pont" zavarja az egyéb WPF- és/vagy XAML-funkciókat, például a csatolt tulajdonságokat.
Az objektumelemszintaxis engedélyezése mellett az objektumdefiníció a tulajdonságelem-szintaxist is engedélyezi minden más olyan nyilvános tulajdonság esetében, amely az objektumot értéktípusként használja. Ennek az az oka, hogy az objektum mostantól objektumelemként példányosítható, és kitöltheti egy ilyen tulajdonság tulajdonságelem-értékét.
Struktúrák
Az egyéni típusokként definiált struktúrák mindig felépíthetők XAML-ben a WPF-ben. Ennek az az oka, hogy a CLR-fordítók implicit módon létrehoznak egy paraméter nélküli konstruktort egy olyan struktúrához, amely az összes tulajdonságértéket inicializálja az alapértelmezett értékekkel. Bizonyos esetekben a szerkezet alapértelmezett építési viselkedése és/vagy objektumelem-használata nem kívánatos. Ennek az lehet az oka, hogy a struktúra az értékek kitöltésére szolgál, és fogalmilag egyesítésként működik, ahol a benne foglalt értékek kölcsönösen kizáró értelmezésekkel rendelkezhetnek, így egyik tulajdonsága sem állítható be. Egy ilyen struktúra WPF-példája a .GridLength Az ilyen struktúráknak általában olyan típuskonvertert kell implementálniuk, hogy az értékek attribútum formában fejezhetők ki, olyan sztringkonvenciák használatával, amelyek a struktúra értékeinek különböző értelmezéseit vagy módjait hozzák létre. A szerkezetnek hasonló viselkedést kell elérhetővé tennie a kódépítéshez egy nem paraméter nélküli konstruktoron keresztül.
Egyéni osztály tulajdonságainak követelményei XAML-attribútumként
A tulajdonságoknak egy (például primitív) értéktípusra kell hivatkoznia, vagy olyan típushoz kell osztályt használniuk, amelyhez paraméter nélküli konstruktor vagy dedikált típuskonverter tartozik, amelyhez egy XAML-processzor hozzáférhet. A CLR XAML implementációban az XAML-processzorok vagy a nyelvi primitívek natív támogatásával TypeConverterAttribute , vagy egy típusra vagy tagra való alkalmazással találják meg az ilyen konvertereket a háttértípus-definíciókban
Alternatív megoldásként a tulajdonság hivatkozhat absztrakt osztálytípusra vagy interfészre. Absztrakt osztályok vagy interfészek esetén az XAML-elemzés elvárása, hogy a tulajdonság értékét konkrét osztálypéldányokkal kell kitölteni, amelyek implementálják az interfészt, vagy az absztrakt osztályból származó típuspéldányokat.
A tulajdonságok absztrakt osztályon deklarálhatók, de csak az absztrakt osztályból származó konkrét osztályokra állíthatók be. Ennek az az oka, hogy az osztály objektumelemének létrehozásához nyilvános paraméter nélküli konstruktorra van szükség az osztályon.
TypeConverter-kompatibilis attribútumszintaxis
Ha dedikált, attribútumokkal rendelkező típuskonvertert ad meg az osztály szintjén, az alkalmazott típuskonvertálás lehetővé teszi az attribútumszintaxist minden olyan tulajdonság esetében, amelynek példányosítania kell az adott típust. A típuskonverter nem engedélyezi a típus objektumelem-használatát; csak az adott típushoz tartozó paraméter nélküli konstruktor jelenléte teszi lehetővé az objektumelemek használatát. Ezért a típuskonverter által engedélyezett tulajdonságok általában nem használhatók a tulajdonságszintaxisban, kivéve, ha maga a típus is támogatja az objektumelemek szintaxisát. Ez alól kivételt képez az, hogy megadhat egy tulajdonságelem szintaxisát, de a tulajdonságelem sztringet tartalmaz. Ez a használat lényegében egyenértékű egy attribútumszintaxis-használattal, és ez a használat nem gyakori, hacsak nem van szükség az attribútumérték robusztusabb térközkezelésére. Például a következő tulajdonság használata karakterláncot fogad, és az attribútumhasználat megfelelője:
<Button>Hallo!
<Button.Language>
de-DE
</Button.Language>
</Button>
<Button Language="de-DE">Hallo!</Button>
Példák olyan tulajdonságokra, amelyekben az attribútumszintaxis engedélyezett, de az objektumelemet tartalmazó tulajdonságelem-szintaxis nem engedélyezett az XAML-ben, különböző tulajdonságok, amelyek a típust Cursor használják. Az Cursor osztály dedikált típuskonverterrel CursorConverterrendelkezik, de nem tesz közzé paraméter nélküli konstruktort, így a Cursor tulajdonság csak attribútumszintaxissal állítható be, annak ellenére, hogy a tényleges Cursor típus referenciatípus.
Per-Property típuskonverterek
Másik lehetőségként maga a tulajdonság deklarálhat egy típuskonvertert a tulajdonság szintjén. Ez lehetővé teszi egy "mininyelv" használatát, amely a tulajdonság típusának megfelelő objektumokat hoz létre, az attribútum bejövő sztringértékeit adva meg bemenetként egy ConvertFrom művelet számára, amely a megfelelő típus alapján dolgozza fel azokat. Ez általában azért történik, hogy kényelmi kiegészítőt biztosítson, és nem egyedüli eszközként egy tulajdonság beállításának engedélyezéséhez az XAML-ben. Azonban olyan attribútumokhoz is használhat típuskonvertereket, ahol olyan meglévő CLR-típusokat szeretne használni, amelyek nem biztosítanak paraméter nélküli konstruktort vagy attribútumalapú típuskonvertert. A WPF API-ból származó példák olyan tulajdonságok, amelyek a típust CultureInfo veszik fel. Ebben az esetben a WPF a meglévő Microsoft .NET-keretrendszertípust CultureInfo használta a keretrendszerek korábbi verzióiban használt kompatibilitási és migrálási forgatókönyvek jobb kezelésére, de a CultureInfo típus nem támogatta a szükséges konstruktorokat vagy típusszintű átalakítást, hogy közvetlenül XAML-tulajdonságértékként használható legyen.
Ha olyan tulajdonságot tesz elérhetővé, amelyet XAML-ben használnak, különösen akkor, ha Ön vezérlő fejlesztő, érdemes megfontolnia a tulajdonságot egy függőségi tulajdonsággal támogatni. Ez különösen igaz, ha az XAML-processzor meglévő Windows Presentation Foundation (WPF) implementációját használja, mert DependencyProperty backing használatával optimalizálhatja a teljesítményt. A függőségi tulajdonság elérhetővé teszi a tulajdonság tulajdonságrendszer-funkcióit, amelyeket a felhasználók elvárnak egy XAML-hozzáférésű tulajdonságtól. Ilyenek például az animáció, az adatkötés és a stílustámogatás. További információ: Egyéni függőségi tulajdonságok és XAML-betöltési és függőségi tulajdonságok.
Típuskonverter írása és hozzárendelése
Időnként testreszabott TypeConverter származtatott osztályt kell írnia, hogy típusátalakítást biztosítson a tulajdonság típusa számára. Az XAML-használatokat támogató típuskonverterek létrehozásával és származtatásával kapcsolatos utasításokért, valamint arról, hogyan kell alkalmazni az TypeConverterAttribute-t, lásd: TypeConverters és XAML.
Az XAML eseménykezelő attribútumszintaxisának követelményei egyéni osztály eseményein
Ahhoz, hogy használható legyen CLR-eseményként, az eseményt nyilvános eseményként kell elérhetővé tenni egy paraméter nélküli konstruktort támogató osztályon, vagy egy absztrakt osztályon, ahol az esemény származtatott osztályokon érhető el. Annak érdekében, hogy kényelmesen használható legyen irányított eseményként, a CLR-eseménynek explicit add és remove metódusokat kell implementálnia, amelyek hozzáadják és eltávolítják a CLR-esemény kezelőinek, és továbbítják ezeket a kezelőket a AddHandler és RemoveHandler metódusokhoz. Ezek a metódusok hozzáadják vagy eltávolítják a kezelőket az irányított eseménykezelő tárolóba azon a példányon, amelyhez az esemény csatlakoztatva van.
Megjegyzés:
Kezelők közvetlenül regisztrálhatók az irányított eseményekhez, a AddHandler használatával, és szándékosan dönthetünk úgy, hogy nem definiálunk olyan CLR-eseményt, amely láthatóvá teszi az irányított eseményt. Ez általában nem ajánlott, mert az esemény nem engedélyezi az XAML attribútumszintaxisát a kezelők csatolásához, és az eredményként kapott osztály kevésbé átlátható XAML-nézetet kínál az adott típus képességeiről.
Gyűjtemény tulajdonságainak írása
A gyűjteménytípust használó tulajdonságok XAML szintaxissal rendelkeznek, amely lehetővé teszi a gyűjteményhez hozzáadott objektumok megadását. Ez a szintaxis két figyelemre méltó funkcióval rendelkezik.
Az objektumot, amely a gyűjteményobjektum, nem kell megadni az objektumelem szintaxisában. Ennek a gyűjteménytípusnak a jelenléte implicit, amikor megad egy XAML-ben egy olyan tulajdonságot, amely gyűjteménytípust használ.
A kódtárban lévő gyűjteménytulajdonság gyermekelemei feldolgozásra kerülnek, hogy a gyűjtemény tagjaivá váljanak. A gyűjtemény tagjaihoz való kódhozzáférést általában lista-/szótár-metódusok, például
Addegy indexelő vagy egy indexelő végzi. Az XAML szintaxis azonban nem támogatja a metódusokat és az indexelőket (kivétel: az XAML 2009 támogatja a metódusokat, de az XAML 2009 használata korlátozza a WPF lehetséges használatát; lásd az XAML 2009 nyelvi funkcióit). A gyűjtemények nyilvánvalóan nagyon gyakori követelmény egy elemfa létrehozásához, és valamilyen módon kell feltölteni ezeket a gyűjteményeket deklaratív XAML-ben. Ezért a gyűjteménytulajdonságok gyermekelemei úgy lesznek feldolgozva, hogy hozzáadják őket ahhoz a gyűjteményhez, amely a gyűjteménytulajdonság-típus értéke.
A .NET Framework XAML Services implementációja és így a WPF XAML-processzor a következő definíciót használja a gyűjteménytulajdonságok meghatározásához. A tulajdonság tulajdonságtípusának az alábbiak egyikét kell implementálnia:
Implementálja IList.
Implementálja IDictionary.
A(z) Array-ből származik (a tömbökről az XAML-ben további információért lásd: x:Array Markup Extension.)
Implementálja IAddChild (a WPF által definiált felület).
A CLR minden ilyen típusa rendelkezik egy Add metódussal, amelyet az XAML-processzor használ az objektumdiagram létrehozásakor az alapul szolgáló gyűjtemény elemeinek hozzáadásához.
Megjegyzés:
A WPF XAML processzor nem támogatja az általános List és Dictionary interfészeket (IList<T> és IDictionary<TKey,TValue>) a gyűjteményészlelésben. A List<T> osztályt azonban alaposztályként is használhatja, mivel közvetlenül implementálja IList, vagy Dictionary<TKey,TValue> alaposztályként, mert közvetlenül implementálja IDictionary.
Amikor egy gyűjteményt kezelő tulajdonságot deklarál, legyen óvatos azzal kapcsolatban, hogy hogyan kerül inicializálásra a tulajdonság értéke az új típuspéldányokban. Ha nem függőségi tulajdonságként implementálja a tulajdonságot, akkor megfelelő, ha a tulajdonság egy olyan háttérmezőt használ, amely meghívja a gyűjteménytípus-konstruktort. Ha a tulajdonság függőségi tulajdonság, akkor előfordulhat, hogy inicializálnia kell a gyűjteménytulajdonságot az alapértelmezett típusú konstruktor részeként. Ennek az az oka, hogy egy függőségi tulajdonság a metaadatokból veszi át az alapértelmezett értékét, és általában nem szeretné, hogy a gyűjteménytulajdonság kezdeti értéke statikus, megosztott gyűjtemény legyen. Minden egyes típuspéldánynak tartalmaznia kell egy gyűjteménypéldányt. További információ: Egyéni függőség tulajdonságai.
Egyéni gyűjteménytípust implementálhat az ön gyűjteménytulajdonságához. Az implicit gyűjteménytulajdonság-kezelés miatt az egyéni gyűjteménytípusnak nem kell paraméter nélküli konstruktort biztosítania ahhoz, hogy implicit módon lehessen használni az XAML-ben. A gyűjteménytípushoz azonban megadhat paraméter nélküli konstruktort is. Ez érdemes gyakorlat lehet. Ha nem ad meg paraméter nélküli konstruktort, nem deklarálhatja explicit módon a gyűjteményt objektumelemként. Előfordulhat, hogy egyes jelölőnyelv szerzői szívesebben látják az explicit gyűjteményt a jelölőnyelv stíluselemeként. Emellett a paraméter nélküli konstruktorok egyszerűsíthetik az inicializálási követelményeket, amikor olyan új objektumokat hoz létre, amelyek tulajdonságértékként használják a gyűjtemény típusát.
XAML-tartalomtulajdonságok deklarálása
Az XAML nyelv határozza meg az XAML tartalomtulajdonság fogalmát. Az objektumszintaxisban használható osztályok mindegyike pontosan egy XAML tartalomtulajdonságú lehet. Ha egy tulajdonságot az osztály XAML tartalomtulajdonságának szeretne deklarálni, alkalmazza az ContentPropertyAttribute osztálydefiníció részeként. Adja meg a kívánt XAML-tartalomtulajdonság nevét az Name attribútumban. A tulajdonság név szerint sztringként van megadva, nem tükrözési szerkezetként, például PropertyInfo.
Megadhat egy gyűjteménytulajdonságot, hogy az legyen az XAML tartalomtulajdonsága. Ez egy olyan használatot eredményez a tulajdonsághoz, amely szerint az objektumelem egy vagy több gyermekelemet tartalmazhat, anélkül, hogy a gyűjtemény objektumelemeinek vagy tulajdonságelem-címkéinek beleavatkozása lenne. Ezeket az elemeket a rendszer ezután az XAML tartalomtulajdonság értékeként kezeli, és hozzáadja a háttérgyűjtemény-példányhoz.
Egyes meglévő XAML-tartalomtulajdonságok a tulajdonságtípust használják Object. Lehetővé teszi egy olyan XAML-tartalomtulajdonság használatát, amely képes primitív értékeket, mint például egy String, valamint egyetlen hivatkozásobjektum-értéket is kezelni. Ha ezt a modellt követi, a típus felelős a típus meghatározásáért, valamint a lehetséges típusok kezeléséért. A tartalomtípus jellemző oka Object, hogy támogatja az objektumtartalom egyszerű hozzáadását karakterláncként (amely alapértelmezettképpen kerül bemutatásra), vagy egy fejlett módszert az objektumtartalom hozzáadására, amely nem alapértelmezett bemutatót, vagy további adatokat határoz meg.
XAML szerializálása
Bizonyos forgatókönyvek esetében, például ha Ön vezérlőszerző, azt is biztosítani szeretné, hogy az XAML-ben példányosítható objektumábrázolások szerializálhatók legyenek vissza a vele egyenértékű XAML jelölésre. A szerializálási követelményeket ebben a témakörben nem ismertetjük. Lásd: Vezérlők készítése – áttekintés , elemfa és szerializálás.
Lásd még
- XAML WPF-
- egyéni függőségi tulajdonságok
- Vezérlők létrehozásának áttekintése
- alapelemek áttekintése
- XAML betöltési és függőségi tulajdonságok
.NET Desktop feedback