Sdílet prostřednictvím


Jmenné prostory XAML a mapování jmenných prostorů pro WPF XAML

Toto téma dále vysvětluje přítomnost a účel dvou mapování oboru názvů XAML, které se často nacházejí v kořenové značce souboru WPF XAML. Popisuje také, jak vytvořit podobná mapování pro použití prvků definovaných ve vašem vlastním kódu nebo v rámci samostatných sestavení.

Co je obor názvů XAML

Obor názvů XAML je ve skutečnosti rozšířením konceptu oboru názvů XML. Techniky určení oboru názvů XAML spoléhají na syntaxi oboru názvů XML, konvenci použití identifikátorů URI jako identifikátorů oboru názvů, použití předpon k poskytnutí prostředků pro odkazování na více oborů názvů ze stejného zdroje značek atd. Primární koncept přidaný do definice XAML oboru názvů XML spočívá v tom, že obor názvů XAML znamená jak jedinečnost pro použití značek, tak i vliv na to, jak jsou entity značek potenciálně podporovány konkrétními obory názvů CLR a odkazovanými sestaveními. Tento druhý faktor je také ovlivněn konceptem kontextu schématu XAML. Pro účely toho, jak WPF pracuje s obory názvů XAML, si obecně můžete představit obory názvů XAML z hlediska výchozího oboru názvů XAML, oboru názvů jazyka XAML a všech dalších oborů názvů XAML, které jsou namapovány kódem XAML přímo na konkrétní záložní obory názvů CLR a odkazovaná sestavení.

Deklarace jmenného prostoru WPF a XAML

V rámci deklarací oboru názvů v kořenové značce mnoha souborů XAML uvidíte, že existují obvykle dvě deklarace oboru názvů XML. První deklarace mapuje celkový obor názvů XAML klienta / frameworku WPF jako výchozí.

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

Druhá deklarace mapuje samostatný obor názvů XAML a mapuje ho (obvykle) na předponu x:.

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

Vztah mezi těmito deklaracemi spočívá v tom, že mapování předpon x: podporuje vnitřní objekty, které jsou součástí definice jazyka XAML, a WPF je jedna implementace, která používá XAML jako jazyk a definuje slovník svých objektů pro XAML. Vzhledem k tomu, že použití slovníku WPF bude mnohem častější než použití vnitřních objektů XAML, je slovník WPF mapován jako výchozí.

Za x: konvencí předpony pro mapování podpory vnitřních objektů jazyka XAML následuje šablony projektů, vzorový kód a dokumentace jazykových funkcí v rámci této sady SDK. Obor názvů XAML definuje mnoho běžně používaných funkcí, které jsou nezbytné i pro základní aplikace WPF. Chcete-li například spojit jakýkoli kód na pozadí s XAML souborem prostřednictvím částečné třídy, musíte tuto třídu pojmenovat jako atribut x:Class v kořenovém prvku příslušného souboru XAML. Nebo jakýkoli prvek definovaný na stránce XAML, ke které chcete získat přístup jako klíčovaný prostředek, by měl mít atribut x:Key nastavený na daný prvek. Další informace o těchto a dalších aspektech XAML naleznete v tématu XAML ve WPF nebo podrobná syntaxe XAML.

Mapování na vlastní třídy a sestavení

Obory názvů XML můžete mapovat na sestavení pomocí řady tokenů v rámci deklarace předpony xmlns, podobně jako jsou standardní obory názvů WPF a intrinských prvků XAML mapovány na předpony.

Syntaxe přebírá následující možné pojmenované tokeny a následující hodnoty:

clr-namespace: Obor názvů CLR deklarovaný v rámci sestavení, který obsahuje veřejné typy k zveřejnění jako elementy.

assembly= Sestavení, které obsahuje některé nebo všechny odkazované obory názvů CLR. Tato hodnota je obvykle jen název sestavení, nikoli cesta, a nezahrnuje příponu (například .dll nebo .exe). Cesta k danému sestavení musí být vytvořena jako odkaz na projekt v souboru projektu, který obsahuje XAML, který se pokoušíte mapovat. Aby bylo možné začlenit verzování a podepisování silným názvem, může být hodnota assembly řetězec, jak je definováno pomocí AssemblyName, nikoli jednoduchým názvem bez řetězce.

Všimněte si, že znak oddělující token clr-namespace od jeho hodnoty je dvojtečka (:), zatímco znak oddělující token assembly od jeho hodnoty je znaménko rovná se (=). Znak, který se má použít mezi těmito dvěma tokeny, je středník. Do deklarace také nezahrnujte žádné prázdné znaky.

Příklad základního vlastního mapování

Následující kód definuje příklad vlastní třídy:

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

Tato vlastní třída je pak zkompilována do knihovny, která podle nastavení projektu (není zobrazena) má název SDKSampleLibrary.

Abyste mohli na tuto vlastní třídu odkazovat, musíte ji také zahrnout jako referenci pro aktuální projekt, což byste obvykle dělali pomocí uživatelského rozhraní Průzkumníka řešení v sadě Visual Studio.

Teď, když máte knihovnu obsahující třídu a odkaz na ni v nastavení projektu, můžete přidat následující mapování předpon jako součást kořenového prvku v XAML:

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

Abychom to všechno dali dohromady, následuje XAML, který obsahuje vlastní mapování spolu s typickým výchozím nastavením a x: mapováním v kořenové značce, a pak použije odkaz s předponou k vytvoření instance ExampleClass v tomto UI.

<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>  

Mapování k aktuálním sestavením

Pokud je clr-namespace odkazováno ve stejném sestavení jako aplikační kód odkazující na vlastní třídy, lze assembly vynechat. Nebo je ekvivalentní syntaxí pro tento případ zadat assembly=bez tokenu řetězce za znaménkem rovná se.

Vlastní třídy nelze použít jako kořenový prvek stránky, pokud je definován ve stejném sestavení. Částečné třídy nemusí být mapovány; Pouze třídy, které nejsou částečnou třídou stránky ve vaší aplikaci, musí být mapovány, pokud je chcete odkazovat jako prvky v XAML.

Mapování oborů názvů CLR na obory názvů XML v sestavení

WPF definuje atribut CLR, který využívá procesory XAML za účelem mapování více oborů názvů CLR na jeden obor názvů XAML. Tento atribut, XmlnsDefinitionAttribute, je umístěn na úrovni sestavení ve zdrojovém kódu, který vytváří sestavení. Zdrojový kód sestavení WPF používá tento atribut k mapování různých běžných názvových prostorů, jako jsou System.Windows a System.Windows.Controls, do názvového prostoru http://schemas.microsoft.com/winfx/2006/xaml/presentation.

XmlnsDefinitionAttribute má dva parametry: název oboru názvů XML/XAML a název oboru názvů CLR. K mapování více oborů názvů CLR na stejný obor názvů XML může existovat více XmlnsDefinitionAttribute. Po namapování lze na členy těchto oborů názvů odkazovat i bez úplné kvalifikace, pokud je to žádoucí, poskytnutím příslušného příkazu using na stránce s kódem částečné třídy. Další podrobnosti najdete v tématu XmlnsDefinitionAttribute.

Obory názvů návrháře a další předpony ze šablon XAML

Pokud pracujete s vývojovými prostředími nebo nástroji pro návrh pro WPF XAML, můžete si všimnout, že v kódu XAML existují další definované obory názvů a předpony XAML.

WpF Designer pro Visual Studio používá obor názvů návrháře, který je obvykle mapován na předponu d:. Novější šablony projektů pro WPF můžou předem namapovat tento obor názvů XAML tak, aby podporovaly výměnu XAML mezi návrhářem WPF pro Visual Studio a dalšími návrhovými prostředími. Tento obor názvů XAML návrhu slouží k zachování stavu návrhu při obousměrném zpracování uživatelského rozhraní založeného na XAML v návrháři. Používá se také pro funkce, jako je d:IsDataSource, které v návrháři umožňují zdroje dat za běhu.

Další předpona, která může být mapována, je mc:. mc: je z důvodu kompatibility značek a využívá vzor kompatibility značek, který není nutně specifický pro XAML. Do určité míry lze funkce kompatibility značek použít k výměně XAML mezi architekturami nebo napříč jinými hranicemi implementace backingu, práce mezi kontexty schématu XAML, zajištění kompatibility pro omezené režimy v návrhářích atd. Další informace o konceptech kompatibility značek a o tom, jak souvisí s WPF, naleznete v tématu Kompatibilita značek (mc:) Jazykové funkce.

Načítání WPF a sestavení

Kontext schématu XAML pro WPF se integruje s aplikačním modelem WPF, který využívá koncept definovaný CLR AppDomain. Následující sekvence popisuje, jak kontext schématu XAML interpretuje, jak načíst sestavení nebo najít typy při běhu nebo návrhu na základě použití WPF AppDomain a dalších faktorů.

  1. Iterujte přes AppDomaina hledejte již načtené sestavení, které odpovídá všem aspektům názvu, počínaje těmi nejnověji načtenými.

  2. Pokud je název kvalifikovaný, zavolejte Assembly.Load(String) pro kvalifikovaný název.

  3. Pokud krátký název + token veřejného klíče kvalifikovaného názvu odpovídá sestavení, ze kterého byl kód načten, vraťte toto sestavení.

  4. K volání Assembly.Load(String)použijte krátký název a token veřejného klíče .

  5. Pokud je název nekvalifikovaný, zavolejte Assembly.LoadWithPartialName.

Loose XAML nepoužívá krok 3; není načtené ze žádné sestavy.

Zkompilované XAML pro WPF (generované prostřednictvím XamlBuildTask) nepoužívá již načtená sestavení z AppDomain (krok 1). Název by také nikdy neměl být ponechán bez kvalifikace ve výstupu XamlBuildTask, takže krok 5 není použitelný.

Kompilovaný BAML (vygenerovaný prostřednictvím PresentationBuildTask) používá všechny kroky, i když BAML by také neměl obsahovat nekvalifikované názvy sestavení.

Viz také