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


XAML-névterek és névtérleképezés a WPF XAML-hez

Ez a témakör a WPF XAML-fájl gyökércímkéjében gyakran megtalálható két XAML-névtérleképezés jelenlétét és célját is ismerteti. Azt is leírja, hogyan hozhat létre hasonló leképezéseket a saját kódban és/vagy különálló szerelvényekben meghatározott elemek használatához.

Mi az az XAML-névtér?

Az XAML-névtér valójában az XML-névtér fogalmának kiterjesztése. Az XAML-névtér meghatározásának technikái az XML-névtér szintaxisán, az URI-k névtér-azonosítóként való használatának konvencióján alapulnak, az előtagok használatával lehetővé teszik, hogy ugyanarról a forrásból több névtérre hivatkozzon, és így tovább. Az XML-névtér XAML-definíciójának elsődleges koncepciója az, hogy az XAML-névtér a korrektúra-használat egyediségének hatókörét is magában foglalja, és azt is befolyásolja, hogy a korrektúra-entitásokat hogyan lehet adott CLR-névterek és hivatkozott szerelvények segítségével alátámasztani. Ez utóbbi szempontot az XAML-sémakörnyezet fogalma is befolyásolja. A WPF és a XAML-névterek működése szempontjából általában úgy gondolhatunk a XAML-névterekre, mint alapértelmezett XAML-névtérre, a XAML nyelvi névtérre és a további XAML-névterekre, amelyeket az XAML-jelölés közvetlenül egy adott CLR-nyelvi névtérhez és hivatkozott assembly-khez rendel.

A WPF- és XAML-névtér-deklarációk

Számos XAML-fájl gyökércímkéjében található névtérdeklarációkban láthatja, hogy általában két XML-névtér-deklaráció létezik. Az első deklaráció a teljes WPF-ügyfél/ keretrendszer XAML-névterét képezi le alapértelmezettként:

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

A második deklaráció egy külön XAML-névteret képez le, amely (általában) a x: előtaghoz van rendelve.

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

A deklarációk közötti kapcsolat az, hogy a x: előtag-leképezés támogatja az XAML nyelvdefiníció részét képező belső elemeket, a WPF pedig egy olyan implementáció, amely az XAML-t használja nyelvként, és definiálja az objektumainak szókincsét az XAML-hez. Mivel a WPF-szókincs használata sokkal gyakoribb lesz az XAML belső használatánál, a WPF-szókincs lesz az alapértelmezett.

Az XAML nyelvi támogatásának leképezésére vonatkozó x: előtag-konvenciót projektsablonok, mintakódok és az SDK nyelvi funkcióinak dokumentációja követi. Az XAML-névtér számos gyakran használt funkciót határoz meg, amelyek még az alapszintű WPF-alkalmazásokhoz is szükségesek. Ha például egy XAML-fájlhoz kapcsolódó kódrészletet részleges osztályon keresztül szeretne csatlakoztatni, ezt az osztályt a megfelelő XAML-fájl gyökérelemének x:Class attribútumaként kell megadnia. Vagy az XAML-lapon definiált bármely elemnek, amelyet kulcsos erőforrásként szeretne elérni, az adott elemen be kell állítania a x:Key attribútumot. Ezekről és a XAML egyéb aspektusairól további információt a(z) XAML a WPF-ben vagy A XAML szintaxis részleteibentalál.

Hozzárendelés egyéni osztályokhoz és szerelvényekhez

Az XML-névtereket a xmlns előtag deklarációjában található tokenek sorozatával lehet társítani, hasonlóan ahhoz, ahogyan a szabványos WPF- és XAML- saját XAML-névtereket előtagokra társítják.

A szintaxis a következő lehetséges elnevezett tokeneket és értékeket használja:

clr-namespace: A szerelvényen belül deklarált CLR-névtér, amely tartalmazza az elemekként közzéteendő nyilvános típusokat.

assembly= A hivatkozott CLR-névteret vagy annak egy részét tartalmazó szerelvény. Ez az érték általában csak a szerelvény neve, nem az elérési út, és nem tartalmazza a bővítményt (például .dll vagy .exe). A szerelvény elérési útját projekthivatkozásként kell létrehozni a leképíteni kívánt XAML-t tartalmazó projektfájlban. A verziószámozás és az erős névaláírással ellátás beépítéséhez a assembly érték lehet egy olyan karaktersorozat, amit az AssemblyNamehatároz meg, az egyszerű sztringnév helyett.

Vegye figyelembe, hogy a clr-namespace tokent az értékétől kettőspont (:) választja el, míg a assembly tokent egyenlőségjel (=) választja el az értékétől. A két token között használandó karakter pontosvessző. A deklarációban ne adjon meg semmilyen üres helyet.

Egyszerű egyéni leképezési példa

Az alábbi kód egy egyéni példaosztályt határoz meg:

namespace SDKSample {
    public class ExampleClass : ContentControl {
        public ExampleClass() {
        ...
        }
    }
}
Namespace SDKSample
    Public Class ExampleClass
        Inherits ContentControl
         ...
        Public Sub New()
        End Sub
    End Class
End Namespace

Ez az egyéni osztály ezután összeállítják egy könyvtárba, amely a projekt beállításai (nem láthatóak) szerint a SDKSampleLibrarynevet kapja.

Az egyéni osztályra való hivatkozáshoz az aktuális projektben referenciaként is szerepelnie kell, amit általában a Visual Studio Megoldáskezelő felhasználói felületén végezne el.

Most, hogy rendelkezik egy osztályt tartalmazó kódtárval, és a projektbeállításokban hivatkozik rá, hozzáadhatja a következő előtag-leképezést az XAML gyökérelemének részeként:

xmlns:custom="clr-namespace:SDKSample;assembly=SDKSampleLibrary"

Összegezve, a következő XAML tartalmazza az egyéni leképezést, valamint a gyökércímkében a szokásos alapértelmezett és x: leképezéseket, majd egy előtagú hivatkozást használ a ExampleClass példányosítására abban a felhasználói felületben:

<Page x:Class="WPFApplication1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:custom="clr-namespace:SDKSample;assembly=SDKSampleLibrary">
  ...
  <custom:ExampleClass/>
...
</Page>

Megfeleltetés az aktuális összeállításokhoz

assembly kihagyható, ha a hivatkozott clr-namespace ugyanabban a szerelvényben van definiálva, mint az egyéni osztályokra hivatkozó alkalmazáskód. Vagy az ekvivalens szintaxis ebben az esetben a assembly=megadása, anélkül, hogy az egyenlőségjelet egy karakterlánc követné.

Az egyéni osztályok nem használhatók a lap gyökérelemeként, ha ugyanabban az assemblyben vannak definiálva. A részleges osztályokat nem kell leképezni; Csak azokat az osztályokat kell leképezni, amelyek nem egy lap részleges osztályai az alkalmazásban, ha XAML-elemként kíván hivatkozni rájuk.

CLR-névterek leképezése XML-névterekre egy összeállításban

A WPF egy OLYAN CLR-attribútumot határoz meg, amelyet az XAML-processzorok használnak annak érdekében, hogy több CLR-névteret képezhessenek le egyetlen XAML-névtérre. Ez az attribútum (XmlnsDefinitionAttribute) a szerelvény szintjén van elhelyezve a szerelvényt előállító forráskódban. A WPF assembly forráskódja ezt az attribútumot használja a különböző gyakori névterek, például a System.Windows és System.Windows.Controlsnévterek, a http://schemas.microsoft.com/winfx/2006/xaml/presentation névtérrel való leképezéséhez.

A XmlnsDefinitionAttribute két paramétert használ: az XML/XAML névtérnevet és a CLR-névteret. Több XmlnsDefinitionAttribute is létezhet több CLR-névtér ugyanarra az XML-névtérre való leképezéséhez. A megfeleltetés után, ha kívánatos, a névterek tagjaira teljes minősítés nélkül is lehet hivatkozni, amennyiben a megfelelő using utasítást megadjuk a részleges osztály kód mögötti oldalán. További részletekért lásd: XmlnsDefinitionAttribute.

Tervezői névterek és egyéb előtagok XAML-sablonokból

Ha a WPF XAML fejlesztői környezeteivel és/vagy tervezési eszközeivel dolgozik, észreveheti, hogy a XAML jelölés más definiált XAML-névtereket és előtagokat is tartalmaz.

A WPF Designer for Visual Studio egy tervezői névteret használ, amely általában a d:előtaghoz van hozzárendelve. A WPF legújabb projektsablonjai előre leképezést végezhetnek ezen XAML-névtéren, hogy támogassák az XAML felcserélésének támogatását a WPF Designer for Visual Studio és más tervezési környezetek között. Ez a tervezési XAML-névtér a tervezési állapot állandósítására szolgál, miközben az XAML-alapú felhasználói felületet kerekíti a tervezőben. Olyan funkciókhoz is használható, mint a d:IsDataSource, amelyek lehetővé teszik a futtatókörnyezeti adatforrásokat a tervezőkben.

Lehetséges, hogy egy másik leképezett előtag, amit láthat, az mc:. mc: a korrektúrakompatibilitást szolgálja, és olyan korrektúrakompatibilitási mintát tartalmaz, amely nem feltétlenül XAML-specifikus. A korrektúrakompatibilitási funkciók bizonyos mértékig használhatók az XAML keretrendszerek közötti vagy a háttér-implementáció más határai közötti cseréjére, az XAML-sémakörnyezetek közötti munkavégzésre, a tervezők korlátozott módjainak kompatibilitására stb. További információ a korrektúrakompatibilitási fogalmakról és azok WPF-hez való viszonyáról: Korrektúrakompatibilitási (mc:) nyelvi szolgáltatások.

WPF és assembly betöltése

A WPF XAML-sémakörnyezete integrálható a WPF alkalmazásmodellel, amely viszont a AppDomainCLR által definiált koncepcióját használja. Az alábbi lépések sorozata bemutatja, hogyan értelmezi az XAML sémakörnyezete, hogyan tölti be a szerelvényeket vagy találja meg a típusokat futási vagy tervezési időben, a AppDomain és más tényezők WPF-beli használata alapján.

  1. Iteráljon végig a AppDomain-n, és keressen egy már betöltött összeállítást, amely megfelel a név minden aspektusának, a legutóbb betöltöttől kezdve.

  2. Ha a név minősített, hívja a Assembly.Load(String)-t a minősített néven.

  3. Ha egy minősített név rövid neve és nyilvános kulcsjogkivonata megegyezik azzal az assembly-vel, amelyből a jelölőnyelv betöltődött, adja vissza azt az assembly-t.

  4. A Assembly.Load(String)hívásához használja a rövid nevét és a nyilvános kulcs-jogkivonatot.

  5. Ha a név nem megfelelő, hívja meg Assembly.LoadWithPartialName.

A laza XAML nem használja a 3. lépést; nincs a betöltött assembly.

A WPF-hez készült, XamlBuildTask használatával létrehozott XAML nem használja a már betöltött összeállításokat a AppDomain-ból (1. lépés). Emellett a névnek soha nem szabad minősítés nélkül lennie az XamlBuildTask kimenetében, tehát az 5. lépés nem alkalmazható.

A lefordított (a PresentationBuildTask használatával létrehozott) BAML minden lépést alkalmaz, bár a BAML nem tartalmazhat nem minősített szerelvényneveket.

Lásd még