Espacios de nombres y asignación de espacios de nombres XAML para WPFXAML Namespaces and Namespace Mapping for WPF XAML

En este tema se explica con mayor detalle la presencia y el propósito de las dos asignaciones de espacio de nombres XAML que se encuentran a menudo en la etiqueta raíz de cada archivo XAML de WPF.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. También se describe cómo generar asignaciones similares para usar elementos definidos en su propio código y/o dentro de ensamblados independientes.It also describes how to produce similar mappings for using elements that are defined in your own code, and/or within separate assemblies.

¿Qué es un espacio de nombres XAML?What is a XAML Namespace?

Un espacio de nombres XAML es, realmente, una extensión del concepto de espacio de nombres XML.A XAML namespace is really an extension of the concept of an XML namespace. Las técnicas para especificar un espacio de nombres XAML se basan en la sintaxis del espacio de nombres XML, la convención de usar los URI como identificadores de los espacio de nombres y el uso de prefijos para proporcionar un medio para hacer referencia a varios espacios de nombres del mismo origen de marcado, entre otros.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. El concepto principal que se agrega a la definición XAML del espacio de nombres XML es que un espacio de nombres XAML implica un ámbito de singularidad para los usos de marcado y también influye en cómo las entidades de marcado están respaldadas potencialmente por espacios de nombres CLR y ensamblados concretos a los que se hace referencia.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. El concepto de un contexto de esquema XAML influye también en esta última consideración.This latter consideration is also influenced by the concept of a XAML schema context. Pero para el propósito de cómo trabaja WPF con espacios de nombres XAML, puede pensar en los espacios de nombres XAML como en un espacio de nombres XAML predeterminado, el espacio de nombres del lenguaje XAML, y cualquier otro espacio de nombres XAML según lo asigna directamente el marcado XAML para respaldar espacios de nombres CLR y ensamblados específicos a los que se hace referencia.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.

Declaraciones de espacios de nombres en XAML y WPFThe WPF and XAML Namespace Declarations

Dentro de las declaraciones de espacios de nombres de la etiqueta raíz de muchos archivos XAML, observará que normalmente hay dos declaraciones de espacio de nombres XML.Within the namespace declarations in the root tag of many XAML files, you will see that there are typically two XML namespace declarations. La primera declaración asigna el espacio de nombres cliente WPF / marco XAML global como predeterminado:The first declaration maps the overall WPF client / framework XAML namespace as the default:

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

La segunda declaración asigna un espacio de nombres XAML independiente (normalmente) al prefijo 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"

La relación entre estas declaraciones es que la asignación del prefijo x: admite los elementos intrínsecos que forman parte de la definición del lenguaje XAML, y WPFWPF es una implementación que usa XAML como lenguaje y define un vocabulario de sus objetos para 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. Dado que los usos del vocabulario de WPF van a ser mucho más comunes que los usos de los elementos intrínsecos de XAML, el vocabulario de WPF se asigna como valor predeterminado.Because the WPF vocabulary's usages will be far more common than the XAML intrinsics usages, the WPF vocabulary is mapped as the default.

La Convención de prefijos de x: para asignar la compatibilidad de intrínsecos del lenguaje XAML va seguida de las plantillas de proyecto, el código de ejemplo y la documentación de las características del lenguaje de este 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. El espacio de nombres XAML define muchas de las características usadas normalmente que son necesarias incluso para las aplicaciones básicas de WPF.The XAML namespace defines many commonly-used features that are necessary even for basic WPF applications. Por ejemplo, para combinar cualquier código subyacente con un archivo XAML a través de una clase parcial, debe denominar esa clase como el atributo x:Class del elemento raíz del archivo XAML pertinente.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. Por otra parte, cualquier elemento definido en una página XAML al que quiera obtener acceso como recurso con clave debe tener el atributo x:Key establecido en el elemento en cuestión.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. Para obtener más información sobre estos y otros aspectos de XAML, vea Información general sobre XAML (WPF) o Detalles de la sintaxis XAML.For more information on these and other aspects of XAML see XAML Overview (WPF) or XAML Syntax In Detail.

Asignar a clases y ensamblados personalizadosMapping to Custom Classes and Assemblies

Puede asignar espacios de nombres XML a ensamblados usando una serie de tokens dentro de una declaración de prefijo xmlns, de manera parecida al modo en que se asignan a prefijos los espacios de nombres XAML estándar de WPF y de los elementos intrínsecos de 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.

La sintaxis acepta los siguientes tokens con nombre posibles y valores:The syntax takes the following possible named tokens and following values:

clr-namespace: El espacio de nombres CLR declarado dentro del ensamblado que contiene los tipos públicos que se exponen como elementos.clr-namespace: The CLR namespace declared within the assembly that contains the public types to expose as elements.

assembly= el ensamblado que contiene parte o todo el espacio de nombres CLR al que se hace referencia.assembly= The assembly that contains some or all of the referenced CLR namespace. Este valor suele ser simplemente el nombre del ensamblado, no la ruta de acceso, y no incluye la extensión (como .dll o .exe).This value is typically just the name of the assembly, not the path, and does not include the extension (such as .dll or .exe). La ruta de acceso a ese ensamblado se debe establecer como referencia de proyecto en el archivo de proyecto que contiene el XAML que se va a asignar.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. Para incorporar el control de versiones y la firma de nombre seguro, el valor de assembly puede ser una cadena, tal y como se define en AssemblyName, en lugar del nombre de cadena simple.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.

Observe que el carácter que separa el token clr-namespace de su valor es un signo de dos puntos (:), mientras que el carácter que separa el token assembly de su valor es un signo igual (=).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 (=). El carácter que se usa entre estos dos tokens es un punto y coma.The character to use between these two tokens is a semicolon. Además, no incluya ningún espacio en blanco en cualquier parte de la declaración.Also, do not include any white space anywhere in the declaration.

Ejemplo de asignación personalizada básicaA Basic Custom Mapping Example

En el siguiente código se define un ejemplo de clase personalizada: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  

A continuación, esta clase personalizada se compila en una biblioteca, que se denomina SDKSampleLibrary según la configuración del proyecto (no se muestra).This custom class is then compiled into a library, which per the project settings (not shown) is named SDKSampleLibrary.

Para hacer referencia a esta clase personalizada, es necesario incluirla como referencia para su proyecto actual, lo que suele hacerse mediante la interfaz de usuario del Explorador de soluciones en 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.

Ahora que tiene una biblioteca que contiene una clase, y una referencia a ella en la configuración del proyecto, puede agregar la siguiente asignación de prefijo como parte del elemento raíz en 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"

Para combinarlo todo, el siguiente XAML incluye la asignación personalizada junto con las asignaciones predeterminadas y de x: en la etiqueta raíz. Después, usa una referencia con prefijo para crear una instancia de ExampleClass en esa interfaz de usuario: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>  

Asignar a ensamblados actualesMapping to Current Assemblies

Se puede omitir assembly si el clr-namespace al que se hace referencia se define dentro del mismo ensamblado que el código de aplicación que hace referencia a las clases personalizadas.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. Otra sintaxis equivalente para este caso consiste en especificar assembly=, sin ningún token de cadena tras el signo igual.Or, an equivalent syntax for this case is to specify assembly=, with no string token following the equals sign.

Las clases personalizadas no se pueden usar como elemento raíz de una página si se definen en el mismo ensamblado.Custom classes cannot be used as the root element of a page if defined in the same assembly. No es necesario asignar las clases parciales; únicamente es necesario asignar las clases que no son la clase parcial de una página de la aplicación si piensa hacerles referencia como elementos en 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.

Asignar espacios de nombres CLR a espacios de nombres XML en un ensambladoMapping CLR Namespaces to XML Namespaces in an Assembly

WPF define un atributo CLR que usan los procesadores XAML para asignar varios espacios de nombres CLR a un mismo espacio de nombres XAML.WPF defines a CLR attribute that is consumed by XAML processors in order to map multiple CLR namespaces to a single XAML namespace. Este atributo, XmlnsDefinitionAttribute, se coloca en el nivel de ensamblado en el código fuente que genera el ensamblado.This attribute, XmlnsDefinitionAttribute, is placed at the assembly level in the source code that produces the assembly. El código fuente del ensamblado de WPF usa este atributo para asignar los distintos espacios de nombres comunes, como System.Windows y System.Windows.Controls, al espacio de nombres 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.

El XmlnsDefinitionAttribute toma dos parámetros: el nombre del espacio de nombres XML/XAML y el nombre del espacio de nombres CLR.The XmlnsDefinitionAttribute takes two parameters: the XML/XAML namespace name, and the CLR namespace name. Puede haber más de un XmlnsDefinitionAttribute para asignar varios espacios de nombres CLR al mismo espacio de nombres XML.More than one XmlnsDefinitionAttribute can exist to map multiple CLR namespaces to the same XML namespace. Una vez asignados, si se quiere se puede hacer referencia también a los miembros de esos espacios de nombres aunque no estén completos, proporcionando la instrucción using adecuada en la página de código subyacente de la clase parcial.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. Para obtener más información, vea XmlnsDefinitionAttribute.For more details, see XmlnsDefinitionAttribute.

Espacios de nombres de diseñador y otros prefijos de las plantillas XAMLDesigner Namespaces and Other Prefixes From XAML Templates

Si trabaja con entornos de desarrollo o herramientas de diseño para XAML de WPF, tal vez observe que hay otros espacios de nombres XAML / prefijos definidos dentro del marcado 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 Designer for Visual Studio usa un espacio de nombres de diseñador que está asignado normalmente al prefijo d:.uses a designer namespace that is typically mapped to the prefix d:. Las plantillas de proyecto de WPF más recientes podrían pre-asignar este espacio de nombres XAML para admitir el intercambio de XAML entre WPF Designer for Visual Studio y otros entornos de diseño.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. Este espacio de nombres XAML de diseño se usa para perpetuar el estado del diseño mientras la interfaz de usuario basada en XAML en el diseñador va y vuelve.This design XAML namespace is used to perpetuate design state while roundtripping XAML-based UI in the designer. También lo usan características como d:IsDataSource, que habilitan los orígenes de datos en tiempo de ejecución en un diseñador.It is also used for features such as d:IsDataSource, which enable runtime data sources in a designer.

Otro prefijo que podría ver asignado es mc:.Another prefix you might see mapped is mc:. mc: es para ofrecer compatibilidad de marcado, y aprovecha un modelo de compatibilidad de marcado que no es necesariamente específico de XAML.mc: is for markup compatibility, and is leveraging a markup compatibility pattern that is not necessarily XAML-specific. Hasta cierto punto, las características de compatibilidad de marcado se pueden usar para intercambiar XAML entre marcos o entre otros límites de implementación de respaldo, trabajar entre contextos de esquema XAML, ofrecer compatibilidad para modos limitados en los diseñadores, etc.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. Para obtener más información sobre los conceptos de compatibilidad de marcado y su relación con WPF, vea Características del lenguaje de compatibilidad de marcado (mc:).For more information on markup compatibility concepts and how they relate to WPF, see Markup Compatibility (mc:) Language Features.

WPF y carga de ensambladosWPF and Assembly Loading

El contexto de esquema XAML para WPF se integra con el modelo de aplicación de WPF, que a su vez usa el concepto de AppDomaindefinido por CLR.The XAML schema context for WPF integrates with the WPF application model, which in turn uses the CLR-defined concept of AppDomain. La secuencia siguiente describe cómo el contexto de esquema XAML interpreta cómo cargar ensamblados o buscar tipos en tiempo de ejecución o en tiempo de diseño, según el uso de WPF de AppDomain y otros factores.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. Recorra en iteración el AppDomain, buscando un ensamblado ya cargado que coincida con todos los aspectos del nombre, a partir del ensamblado cargado más recientemente.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. Si el nombre es Qualified, llame a Assembly.Load(String) en el nombre completo.If the name is qualified, call Assembly.Load(String) on the qualified name.

  3. Si el nombre corto + el token de clave pública de un nombre completo coinciden con el ensamblado desde el que se ha cargado el marcado, devuelva dicho ensamblado.If the short name + public key token of a qualified name matches the assembly that the markup was loaded from, return that assembly.

  4. Use el nombre corto + el token de clave pública para llamar a Assembly.Load(String).Use the short name + public key token to call Assembly.Load(String).

  5. Si el nombre es Unqualified, llame a Assembly.LoadWithPartialName.If the name is unqualified, call Assembly.LoadWithPartialName.

El XAML dinámico no usa el Paso 3; no hay ensamblado desde el que cargar.Loose XAML does not use Step 3; there is no loaded-from assembly.

El XAML compilado para WPF (generado a través de XamlBuildTask) no usa los ensamblados ya cargados desde AppDomain (paso 1).Compiled XAML for WPF (generated via XamlBuildTask) does not use the already-loaded assemblies from AppDomain (Step 1). Además, el nombre nunca debe estar incompleto en la salida de XamlBuildTask, por lo que el Paso 5 no se aplica.Also, the name should never be unqualified from XamlBuildTask output, so Step 5 does not apply.

El BAML compilado (generado mediante PresentationBuildTask) usa todos los pasos, aunque el BAML tampoco debe contener nombres de ensamblado incompletos.Compiled BAML (generated via PresentationBuildTask) uses all steps, although BAML also should not contain unqualified assembly names.

Vea tambiénSee also