XAML-naamruimten en naamruimtetoewijzing voor WPF XAML
In dit onderwerp wordt de aanwezigheid en het doel van de twee XAML-naamruimtetoewijzingen uitgelegd, zoals vaak te vinden is in de hoofdtag van een WPF XAML-bestand. Er wordt ook beschreven hoe u vergelijkbare toewijzingen kunt maken voor het gebruik van elementen die zijn gedefinieerd in uw eigen code en/of binnen afzonderlijke assemblies.
Wat is een XAML-naamruimte
Een XAML-naamruimte is eigenlijk een uitbreiding van het concept van een XML-naamruimte. De technieken voor het opgeven van een XAML-naamruimte zijn afhankelijk van de syntaxis van de XML-naamruimte, de conventie van het gebruik van URI's als naamruimte-id's, het gebruik van voorvoegsels om te verwijzen naar meerdere naamruimten uit dezelfde markeringsbron, enzovoort. Het primaire concept dat wordt toegevoegd aan de XAML-definitie van de XML-naamruimte is dat een XAML-naamruimte zowel een bereik van uniekheid voor het gebruik van markeringen impliceert, en ook van invloed is op de manier waarop markeringentiteiten mogelijk worden ondersteund door specifieke CLR-naamruimten en assembly's waarnaar wordt verwezen. Deze laatste overweging wordt ook beïnvloed door het concept van een XAML-schemacontext. Maar voor de manier waarop WPF werkt met XAML-naamruimten, kunt u over het algemeen denken aan XAML-naamruimten in termen van een standaard XAML-naamruimte, de XAML-taalnaamruimte en eventuele andere XAML-naamruimten, zoals toegewezen door uw XAML-markeringen, rechtstreeks aan specifieke back-ups van CLR-naamruimten en assembly's waarnaar wordt verwezen.
De WPF- en XAML-naamruimtedeclaraties
In de naamruimtedeclaraties in de hoofdtag van veel XAML-bestanden ziet u dat er meestal twee XML-naamruimtedeclaraties zijn. De eerste declaratie wijst de algemene WPF-client/framework XAML-naamruimte toe als de standaardinstelling:
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
De tweede declaratie wijst een afzonderlijke XAML-naamruimte toe en wijst deze (meestal) toe aan het x:
voorvoegsel.
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
De relatie tussen deze declaraties is dat de x:
voorvoegseltoewijzing de intrinsieke elementen ondersteunt die deel uitmaken van de definitie van de XAML-taal en WPF één implementatie is die XAML als taal gebruikt en een woordenlijst definieert van de objecten voor XAML. Omdat het gebruik van de WPF-woordenlijst veel gebruikelijker is dan het gebruik van XAML intrinsieken, wordt de WPF-vocabulaire toegewezen als de standaardinstelling.
De x:
voorvoegselconventie voor het toewijzen van de intrinsieke XAML-taalondersteuning wordt gevolgd door projectsjablonen, voorbeeldcode en de documentatie van taalfuncties in deze SDK. De XAML-naamruimte definieert veel veelgebruikte functies die nodig zijn, zelfs voor eenvoudige WPF-toepassingen. Als u bijvoorbeeld code wilt toevoegen aan een XAML-bestand via een gedeeltelijke klasse, moet u die klasse een naam geven als het x:Class
kenmerk in het hoofdelement van het relevante XAML-bestand. Of elk element dat is gedefinieerd op een XAML-pagina die u wilt openen als een sleutelresource, moet het x:Key
kenmerk hebben ingesteld op het betreffende element. Zie voor meer informatie over deze en andere aspecten van XAML XAML in WPF of XAML-syntaxis in detail.
Toewijzing aan aangepaste klassen en assemblies
U kunt XML-naamruimten toewijzen aan assembly's met behulp van een reeks tokens in een xmlns
-voorvoegseldeclaratie, vergelijkbaar met hoe de standaardnaamruimten van WPF en XAML-intrinsieke XAML-naamruimten aan voorvoegsels worden toegewezen.
De syntaxis gebruikt de volgende mogelijke benoemde tokens en de volgende waarden:
clr-namespace:
De CLR-naamruimte die is gedeclareerd in de assembly die de openbare typen bevat die als elementen moeten worden weergegeven.
assembly=
De assembly die enkele of alle van de genoemde CLR-naamruimten bevat. Deze waarde is doorgaans alleen de naam van de assembly, niet het pad en bevat niet de extensie (zoals .dll of .exe). Het pad naar die assembly moet in het projectbestand worden ingesteld als een projectverwijzing, waarin de XAML staat die u wilt toewijzen. Als u versiebeheer en ondertekening met een sterke naam wilt opnemen, kan de assembly
waarde een tekenreeks zijn zoals gedefinieerd door AssemblyName, in plaats van de eenvoudige tekenreeksnaam.
Let op dat het teken dat de clr-namespace
-token van de waarde scheidt een dubbelpunt (:) is, terwijl het teken dat de assembly
-token van de waarde scheidt een gelijkteken (=) is. Het teken dat tussen deze twee tokens moet worden gebruikt, is een puntkomma. Neem ook nergens in de declaratie witruimte op.
Een basisvoorbeeld van een aangepaste mapping
Met de volgende code wordt een voorbeeld van een aangepaste klasse gedefinieerd:
namespace SDKSample {
public class ExampleClass : ContentControl {
public ExampleClass() {
...
}
}
}
Namespace SDKSample
Public Class ExampleClass
Inherits ContentControl
...
Public Sub New()
End Sub
End Class
End Namespace
Deze aangepaste klasse wordt vervolgens gecompileerd in een bibliotheek, die volgens de projectinstellingen (niet weergegeven) SDKSampleLibrary
wordt genoemd.
Als u naar deze aangepaste klasse wilt verwijzen, moet u deze ook opnemen als referentie voor uw huidige project, wat u doorgaans zou doen met behulp van de Solution Explorer-gebruikersinterface in Visual Studio.
Nu u een bibliotheek met een klasse en een verwijzing naar deze bibliotheek in projectinstellingen hebt, kunt u de volgende voorvoegseltoewijzing toevoegen als onderdeel van uw hoofdelement in XAML:
xmlns:custom="clr-namespace:SDKSample;assembly=SDKSampleLibrary"
Om alles samen te stellen, is het volgende XAML dat de aangepaste toewijzing bevat, samen met de gebruikelijke standaard- en x:-toewijzingen in de hoofdtag, en vervolgens een vooraf gedefinieerde prefixverwijzing gebruikt om een instantie van ExampleClass
in die gebruikersinterface te maken.
<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>
Toewijzing aan huidige assembly's
assembly
kan worden weggelaten als de clr-namespace
waarnaar wordt verwezen binnen dezelfde assembly wordt gedefinieerd als de toepassingscode die verwijst naar de aangepaste klassen. Een andere equivalente syntaxis voor dit geval is om assembly=
op te geven, zonder tekenreeks na het gelijkteken.
Aangepaste klassen kunnen niet worden gebruikt als het hoofdelement van een pagina als deze zijn gedefinieerd in dezelfde assembly. Gedeeltelijke klassen hoeven niet te worden toegewezen; alleen klassen die niet de gedeeltelijke klasse van een pagina in uw toepassing zijn, moeten worden toegewezen als u ernaar wilt verwijzen als elementen in XAML.
CLR-namespaces koppelen aan XML-namespaces in een assembly
WPF definieert een CLR-kenmerk dat wordt gebruikt door XAML-processors om meerdere CLR-naamruimten toe te wijzen aan één XAML-naamruimte. Dit kenmerk, XmlnsDefinitionAttribute, wordt geplaatst op het niveau van de samenstelling in de broncode die het samenstel produceert. De WPF-assemblybroncode gebruikt dit kenmerk om de verschillende algemene naamruimten, zoals System.Windows en System.Windows.Controls, toe te wijzen aan de http://schemas.microsoft.com/winfx/2006/xaml/presentation
naamruimte.
De XmlnsDefinitionAttribute gebruikt twee parameters: de naam van de XML/XAML-naamruimte en de naam van de CLR-naamruimte. Er kunnen meerdere XmlnsDefinitionAttribute bestaan om meerdere CLR-naamruimten toe te wijzen aan dezelfde XML-naamruimte. Zodra deze naamruimten in kaart zijn gebracht, kan er voor leden van deze naamruimten ook zonder volledige kwalificatie worden verwezen, indien gewenst, door de juiste using
-instructie op te geven op de gedeeltelijke code-achter-pagina. Zie XmlnsDefinitionAttributevoor meer informatie.
Designer-naamruimten en andere voorvoegsels van XAML-sjablonen
Als u met ontwikkelomgevingen en/of ontwerphulpprogramma's voor WPF XAML werkt, merkt u mogelijk dat er andere gedefinieerde XAML-naamruimten/voorvoegsels binnen de XAML-markeringen zijn.
WPF Designer voor Visual Studio maakt gebruik van een ontwerpnaamruimte die doorgaans is toegewezen aan het voorvoegsel d:
. Meer recente projectsjablonen voor WPF kunnen deze XAML-naamruimte vooraf toewijzen ter ondersteuning van de uitwisseling van de XAML tussen WPF Designer voor Visual Studio en andere ontwerpomgevingen. Deze XAML-naamruimte wordt gebruikt om de ontwerpstatus te handhaven terwijl de XAML-gebaseerde gebruikersinterface in de ontwerper heen en weer wordt omgezet. Het wordt ook gebruikt voor functies zoals d:IsDataSource
, waarmee runtimegegevensbronnen in een ontwerpfunctie kunnen worden ingeschakeld.
Een ander voorvoegsel dat u wellicht ziet toegewezen, is mc:
.
mc:
is bedoeld voor compatibiliteit met markeringen en maakt gebruik van een markeringscompatibiliteitspatroon dat niet noodzakelijkerwijs XAML-specifiek is. In sommige gevallen kunnen de compatibiliteitsfuncties voor markup worden gebruikt voor het uitwisselen van XAML tussen frameworks of andere implementatiegrenzen, werken tussen XAML-schemacontexten, compatibiliteit bieden voor beperkte modi in designmodi, enzovoort. Zie Markup Compatibility (mc:) Language Featuresvoor meer informatie over compatibiliteitsconcepten voor markeringen en hoe deze betrekking hebben op WPF.
WPF en assembly laden
De XAML-schemacontext voor WPF kan worden geïntegreerd met het WPF-toepassingsmodel, dat op zijn beurt gebruikmaakt van het door CLR gedefinieerde concept van AppDomain. In de volgende reeks wordt beschreven hoe de XAML-schemacontext interpreteert hoe u assembly's laadt of typen vindt tijdens runtime of ontwerptijd, op basis van het WPF-gebruik van AppDomain en andere factoren.
Doorloop de AppDomainterwijl je zoekt naar een al geladen assembly die op alle aspecten overeenkomt met de naam, te beginnen met de meest recent geladen assembly.
Als de naam is gekwalificeerd, roept u Assembly.Load(String) aan op de gekwalificeerde naam.
Als de korte naam + openbare-sleuteltoken van een gekwalificeerde naam overeenkomt met de assembly waaruit de markering is geladen, retourneert u die assembly.
Gebruik de korte naam + openbare sleuteltoken om Assembly.Load(String)aan te roepen.
Als de naam niet gekwalificeerd is, roept u Assembly.LoadWithPartialNameaan.
Losse XAML maakt geen gebruik van stap 3; er is geen loaded-from-assembly.
Gecompileerde XAML voor WPF (gegenereerd via XamlBuildTask) maakt geen gebruik van de reeds geladen assembly's uit AppDomain (stap 1). De naam mag nooit ongeduid worden gelaten in de uitvoer van XamlBuildTask, dus Stap 5 is niet van toepassing.
Gecompileerde BAML (gegenereerd via PresentationBuildTask) gebruikt alle stappen, hoewel BAML ook geen niet-gekwalificeerde assemblynamen mag bevatten.
Zie ook
.NET Desktop feedback