Пространства имен XAML и сопоставление пространств имен для WPF XAMLXAML Namespaces and Namespace Mapping for WPF XAML

В этом разделе обосновывается наличие и рассматриваются цели сопоставления двух пространств имен XAML, обычно содержащихся в корневом теге файла WPF XAML.This topic further explains the presence and purpose of the two XAML namespace mappings as often found in the root tag of a WPF XAML file. Также описываются способы создания аналогичных сопоставлений для использования элементов, заданных в коде и/или в отдельных сборках.It also describes how to produce similar mappings for using elements that are defined in your own code, and/or within separate assemblies.

Общие сведения о пространстве имен XAMLWhat is a XAML Namespace?

Пространство имен XAML — это расширение концепции пространства имен XML.A XAML namespace is really an extension of the concept of an XML namespace. При указании пространства имен XAML используется синтаксис пространства имен XML: соблюдается принцип использования универсальных кодов ресурсов (URI) в качестве идентификаторов пространств имен, использование префиксов, позволяющих указать несколько пространств имен с общим исходным кодом разметки и т. п.The techniques of specifying a XAML namespace rely on the XML namespace syntax, the convention of using URIs as namespace identifiers, using prefixes to provide a means to reference multiple namespaces from the same markup source, and so on. Основное нововведение в определении пространства имен XML, используемом в XAML, заключается в том, что пространство имен XAML неявно задает область уникальности используемой разметки и при этом влияет на возможное дополнение сущностей разметки определенными пространствами имен CLR и указанными в них сборками.The primary concept that is added to the XAML definition of the XML namespace is that a XAML namespace implies both a scope of uniqueness for the markup usages, and also influences how markup entities are potentially backed by specific CLR namespaces and referenced assemblies. Последний фактор обусловлен в том числе природой контекста схемы XAML.This latter consideration is also influenced by the concept of a XAML schema context. Впрочем, в отношении взаимодействия WPF с пространствами имен XAML можно рассматривать пространства имен XAML с учетом пространства имен XAML по умолчанию, пространства имен языка XAML и любых других пространств имен XAML, напрямую сопоставленных в разметке XAML с дополняющими их пространствами имен CLR и указанными в них сборками.But for purposes of how WPF works with XAML namespaces, you can generally think of XAML namespaces in terms of a default XAML namespace, the XAML language namespace, and any further XAML namespaces as mapped by your XAML markup directly to specific backing CLR namespaces and referenced assemblies.

WPF и объявления пространства имен XAMLThe WPF and XAML Namespace Declarations

В объявлении пространства имен в корневом теге многих XAML-файлов, как правило, содержатся два объявления пространства имен XML.Within the namespace declarations in the root tag of many XAML files, you will see that there are typically two XML namespace declarations. Первое объявление задает сопоставление для общего пространства имен клиента WPF и платформы XAML как для пространства имен по умолчанию.The first declaration maps the overall WPF client / framework XAML namespace as the default:

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

Второе объявление сопоставляет отдельное пространство имен XAML, сопоставляя его (обычно) с префиксом x:.The second declaration maps a separate XAML namespace, mapping it (typically) to the x: prefix.

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

Связь между этими объявлениями состоит в том, что сопоставление префикса x: поддерживает встроенные функции, которые являются частью определения языка XAML и WPFWPF является реализацией, которая использует XAML в качестве языка и определяет словарь объектов для XAML.The relationship between these declarations is that the x: prefix mapping supports the intrinsics that are part of the XAML language definition, and WPFWPF is one implementation that uses XAML as a language and defines a vocabulary of its objects for XAML. Так как использование словаря WPF более распространено, чем использование встроенных функций XAML, словарь WPF сопоставляется по умолчанию.Because the WPF vocabulary's usages will be far more common than the XAML intrinsics usages, the WPF vocabulary is mapped as the default.

В соглашении о префиксах x: для сопоставления встроенных функций языка XAML следуют шаблоны проектов, примеры кода и документация по функциональным возможностям языка в этом пакете SDK.The x: prefix convention for mapping the XAML language intrinsics support is followed by project templates, sample code, and the documentation of language features within this SDK. Пространство имен XAML определяет многие часто используемые функциональные возможности, которые необходимы даже для основных приложений WPF.The XAML namespace defines many commonly-used features that are necessary even for basic WPF applications. Например, чтобы присоединить какой-либо код программной части к XAML-файлу через разделяемый класс, необходимо именовать класс как атрибут x:Class в корневом элементе соответствующего XAML-файла.For instance, in order to join any code-behind to a XAML file through a partial class, you must name that class as the x:Class attribute in the root element of the relevant XAML file. Или же любой элемент, определенный на странице XAML, к которой необходимо получить доступ в качестве ключевого ресурса, должен иметь заданный атрибут x:Key.Or, any element as defined in a XAML page that you wish to access as a keyed resource should have the x:Key attribute set on the element in question. Дополнительные сведения об этих и других аспектах XAML см. в разделах Общие сведения о языке XAML (WPF) и Подробное описание синтаксиса XAML.For more information on these and other aspects of XAML see XAML Overview (WPF) or XAML Syntax In Detail.

Сопоставление пользовательских классов и сборокMapping to Custom Classes and Assemblies

Вы можете сопоставить пространства имен XML со сборками, используя серию токенов в объявлении префиксов xmlns аналогично тому, как стандартные пространства имен WPF и встроенных функций XAML сопоставляются с префиксами.You can map XML namespaces to assemblies using a series of tokens within an xmlns prefix declaration, similar to how the standard WPF and XAML-intrinsics XAML namespaces are mapped to prefixes.

Синтаксис допускает перечисленные ниже возможные именованные токены и значения.The syntax takes the following possible named tokens and following values:

clr-namespace: Пространство имен CLR объявлено внутри сборки, которая содержит открытые типы, предоставленные как элементы.clr-namespace: The CLR namespace declared within the assembly that contains the public types to expose as elements.

assembly= сборку, содержащую некоторые или все связанные пространства имен CLR, на которые имеются ссылки.assembly= The assembly that contains some or all of the referenced CLR namespace. Это значение обычно содержит только имя сборки, но не путь к ней, и не включает расширение имени файла (например, EXE или DLL).This value is typically just the name of the assembly, not the path, and does not include the extension (such as .dll or .exe). Путь к этой сборке должен быть задан в качестве ссылки проекта в файле проекта, который содержит код XAML, который следует сопоставить.The path to that assembly must be established as a project reference in the project file that contains the XAML you are trying to map. Чтобы включить управление версиями и подписывание строгих имен, значение assembly может быть строкой, как определено AssemblyName, а не именем простой строки.In order to incorporate versioning and strong-name signing, the assembly value can be a string as defined by AssemblyName, rather than the simple string name.

Обратите внимание, что токен clr-namespace отделяется от значения двоеточием (:), тогда как токен assembly отделяется от значения знаком равенства (=).Note that the character separating the clr-namespace token from its value is a colon (:) whereas the character separating the assembly token from its value is an equals sign (=). Эти два токена разделяются точкой с запятой.The character to use between these two tokens is a semicolon. Кроме того, не включайте пробел в любом месте объявления.Also, do not include any white space anywhere in the declaration.

Простой пример пользовательского сопоставленияA Basic Custom Mapping Example

В следующем примере кода определяется пользовательский класс.The following code defines an example custom class:

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

Затем пользовательский класс компилируется в библиотеку, которая согласно параметрам проекта (не показано) имеет имя SDKSampleLibrary.This custom class is then compiled into a library, which per the project settings (not shown) is named SDKSampleLibrary.

Для ссылки на этот пользовательский класс также следует включить его в качестве ссылки на текущий проект, что обычно делается с помощью пользовательского интерфейса обозревателя решений в Visual Studio.In order to reference this custom class, you also need to include it as a reference for your current project, which you would typically do using the Solution Explorer UI in Visual Studio.

Теперь, когда есть библиотека с классом и ссылка на него в параметрах проектах, можно добавить следующее сопоставление префикса как часть корневого элемента в XAML.Now that you have a library containing a class, and a reference to it in project settings, you can add the following prefix mapping as part of your root element in XAML:

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

Чтобы собрать это все вместе, используется приведенный ниже код XAML, в который включено пользовательское сопоставление с обычным сопоставлением и сопоставлением x: в корневом теге. Затем используется ссылка с префиксом для создания экземпляра ExampleClass в этом пользовательском интерфейсе.To put it all together, the following is XAML that includes the custom mapping along with the typical default and x: mappings in the root tag, then uses a prefixed reference to instantiate ExampleClass in that 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>  

Сопоставление с текущими сборкамиMapping to Current Assemblies

Можно опустить assembly, если указанное пространство имен clr-namespace определяется в этой же сборке в качестве кода приложения, который ссылается на пользовательские классы.assembly can be omitted if the clr-namespace referenced is being defined within the same assembly as the application code that is referencing the custom classes. Аналогичный способ для этого случая ― указание assembly= без строкового токена после знака равенства.Or, an equivalent syntax for this case is to specify assembly=, with no string token following the equals sign.

Пользовательские классы нельзя использовать в качестве корневого элемента страницы, если они определены в той же сборке.Custom classes cannot be used as the root element of a page if defined in the same assembly. Разделяемые классы не требуют сопоставления; должны быть сопоставлены только классы, которые не являются разделяемыми классами страницы в приложении, если планируется ссылка на них как на элементы в XAML.Partial classes do not need to be mapped; only classes that are not the partial class of a page in your application need to be mapped if you intend to reference them as elements in XAML.

Сопоставление пространств имен CLR с пространствами имен XML в сборкеMapping CLR Namespaces to XML Namespaces in an Assembly

WPF определяет атрибут CLR, который обрабатывается процессорами XAML для сопоставления нескольких пространств имен CLR с одним пространством имен XAML.WPF defines a CLR attribute that is consumed by XAML processors in order to map multiple CLR namespaces to a single XAML namespace. Этот атрибут, XmlnsDefinitionAttribute, помещается на уровне сборки в исходном коде, который создает сборку.This attribute, XmlnsDefinitionAttribute, is placed at the assembly level in the source code that produces the assembly. Исходный код сборки WPF использует этот атрибут для соотнесения различных общих пространств имен, таких как System.Windows и System.Windows.Controls, к пространству имен http://schemas.microsoft.com/winfx/2006/xaml/presentation.The WPF assembly source code uses this attribute to map the various common namespaces, such as System.Windows and System.Windows.Controls, to the http://schemas.microsoft.com/winfx/2006/xaml/presentation namespace.

XmlnsDefinitionAttribute принимает два параметра: имя пространства имен XML/XAML и имя пространства имен CLR.The XmlnsDefinitionAttribute takes two parameters: the XML/XAML namespace name, and the CLR namespace name. Для соответствия нескольких пространств имен CLR одному и тому же пространству имен XML может существовать несколько XmlnsDefinitionAttribute.More than one XmlnsDefinitionAttribute can exist to map multiple CLR namespaces to the same XML namespace. После сопоставления на члены этих пространств имен при желании можно ссылаться без указания полного имени, предоставляя соответствующий оператор using на странице с выделенным кодом разделяемого класса.Once mapped, members of those namespaces can also be referenced without full qualification if desired by providing the appropriate using statement in the partial-class code-behind page. Дополнительные сведения см. в разделе XmlnsDefinitionAttribute.For more details, see XmlnsDefinitionAttribute.

Пространства имен конструктора и другие префиксы из шаблонов XAMLDesigner Namespaces and Other Prefixes From XAML Templates

При работе в средах разработки или со средствами разработки для WPF XAML можно заметить, что в разметке XAML определены и другие пространства имен и префиксы XAML.If you are working with development environments and/or design tools for WPF XAML, you may notice that there are other defined XAML namespaces / prefixes within the XAML markup.

Конструктор WPF для Visual Studio использует пространство имен конструктора, которое обычно сопоставляется с префиксом d:.WPF Designer for Visual Studio uses a designer namespace that is typically mapped to the prefix d:. Более новые шаблоны проектов для WPF могут предварительно сопоставлять это пространство имен XAML для поддержки обмена кодом XAML между конструктором WPF для Visual Studio и другими средами разработки.More recent project templates for WPF might pre-map this XAML namespace to support interchange of the XAML between WPF Designer for Visual Studio and other design environments. Это пространство имен XAML для разработки используется с целью сохранения состояния среды разработки при переносе пользовательского интерфейса, созданного на основе XAML, из одного средства разработки в другое.This design XAML namespace is used to perpetuate design state while roundtripping XAML-based UI in the designer. Оно также используется в таких функциях как d:IsDataSource, позволяющих использовать источники данных среды выполнения в конструкторе.It is also used for features such as d:IsDataSource, which enable runtime data sources in a designer.

Среди сопоставленных префиксов также встречается mc:.Another prefix you might see mapped is mc:. Префикс mc: используется для обеспечения совместимости разметки. С его помощью можно обеспечить шаблон совместимости не только для языка XAML.mc: is for markup compatibility, and is leveraging a markup compatibility pattern that is not necessarily XAML-specific. Функции обеспечения совместимости разметки в некоторой степени можно использовать для обмена кодом XAML между различными платформами, взаимодействия между различными схемами XAML, обеспечения совместимости для ограниченных режимов в конструкторах и т. п.To some extent, the markup compatibility features can be used to exchange XAML between frameworks or across other boundaries of backing implementation, work between XAML schema contexts, provide compatibility for limited modes in designers, and so on. Дополнительные сведения о принципах обеспечения совместимости разметки и их применении к WPF см. в разделе Совместимость разметки (mc:) языковые компоненты.For more information on markup compatibility concepts and how they relate to WPF, see Markup Compatibility (mc:) Language Features.

WPF и загрузка сборокWPF and Assembly Loading

Контекст схемы XAML для WPF интегрируется с моделью приложения WPF, которая, в свою очередь, использует концепцию AppDomain, определяемую CLR.The XAML schema context for WPF integrates with the WPF application model, which in turn uses the CLR-defined concept of AppDomain. Следующая последовательность описывает, как контекст схемы XAML интерпретирует, как загружать сборки или находить типы во время выполнения или во время разработки, основываясь на использовании AppDomain и других факторов в WPF.The following sequence describes how XAML schema context interprets how to either load assemblies or find types at run time or design time, based on the WPF use of AppDomain and other factors.

  1. Выполните итерацию по AppDomainу, чтобы найти уже загруженную сборку, которая соответствует всем аспектам имени, начиная с последней загруженной сборки.Iterate through the AppDomain, looking for an already-loaded assembly that matches all aspects of the name, starting from the most recently loaded assembly.

  2. Если имя уточнено, вызовите Assembly.Load(String) для полного имени.If the name is qualified, call Assembly.Load(String) on the qualified name.

  3. Если сборке, из которой была загружена разметка, соответствует сочетание "короткое имя + токен открытого ключа полного имени", возвратите эту сборку.If the short name + public key token of a qualified name matches the assembly that the markup was loaded from, return that assembly.

  4. Используйте короткое имя + токен открытого ключа для вызова Assembly.Load(String).Use the short name + public key token to call Assembly.Load(String).

  5. Если имя не определено, вызовите Assembly.LoadWithPartialName.If the name is unqualified, call Assembly.LoadWithPartialName.

Свободный XAML не использует шаг 3, так как нет сборки, из которой выполнялась загрузка.Loose XAML does not use Step 3; there is no loaded-from assembly.

Скомпилированный XAML для WPF (сформированный с помощью Ксамлбуилдтаск) не использует уже загруженные сборки из AppDomain (шаг 1).Compiled XAML for WPF (generated via XamlBuildTask) does not use the already-loaded assemblies from AppDomain (Step 1). Кроме того, имя из выходных данных XamlBuildTask не должно быть неполным, поэтому шаг 5 не применяется.Also, the name should never be unqualified from XamlBuildTask output, so Step 5 does not apply.

Скомпилированный BAML (сформированный с помощью PresentationBuildTask) использует все шаги, хотя BAML также не должен содержать неполные имена сборок.Compiled BAML (generated via PresentationBuildTask) uses all steps, although BAML also should not contain unqualified assembly names.

См. такжеSee also