Espacios de nombres XAML para los servicios XAML de .NET

Un espacio de nombres XAML es un concepto que se expande en la definición de un espacio de nombres XML. De forma similar a un espacio de nombres XML, se puede definir un espacio de nombres XAML mediante un atributo xmlns en el marcado. Los espacios de nombres XAML también se representan en la secuencia de nodos XAML y en otras API de servicios XAML. En este tema se define el concepto de espacio de nombres XAML y se describe cómo se pueden definir los espacios de nombres XAML y cómo se usan en contextos de esquema XAML y otros aspectos de los servicios XAML de .NET.

Espacio de nombres XML y espacio de nombres XAML

Un espacio de nombres XAML es un espacio de nombres XML especializado, igual que XAML es una forma especializada de XML y usa el formato XML básico para su marcado. En el marcado se declara un espacio de nombres XAML y su asignación a través de un atributo xmlns aplicado a un elemento. La declaración xmlns se puede realizar en el mismo elemento en el que se declara el espacio de nombres XAML. Una declaración de espacio de nombres XAML realizada en un elemento es válida para ese elemento, todos los atributos de ese elemento y todos los elementos secundarios de ese elemento. Los atributos pueden usar un espacio de nombres XAML que no sea el mismo que el elemento que contiene el atributo, siempre que el propio nombre del atributo haga referencia al prefijo como parte de su nombre de atributo en el marcado.

La distinción de un espacio de nombres XAML frente a un espacio de nombres XML es que se puede usar un espacio de nombres XML para hacer referencia a un esquema o simplemente para diferenciar entidades. Para XAML, los tipos y miembros que se usan en XAML deben resolverse en última instancia para los tipos de respaldo, y los conceptos de esquema XML no se aplican bien a esta funcionalidad. El espacio de nombres XAML contiene información que el contexto de esquema XAML debe tener disponible para realizar esta asignación de tipos.

Componentes del espacio de nombres XAML

La definición del espacio de nombres XAML tiene dos componentes: un prefijo y un identificador. Cada uno de estos componentes está presente cuando se declara un espacio de nombres XAML en el marcado o se define en el sistema de tipos XAML.

El prefijo puede ser cualquier cadena permitida por los espacios de nombres W3C en la especificación XML 1.0. Por convención, los prefijos suelen ser cadenas cortas, ya que el prefijo se repite muchas veces en un archivo de marcado típico. Determinados espacios de nombres XAML que están diseñados para usarse en varias implementaciones XAML usan prefijos convencionales concretos. Por ejemplo, el espacio de nombres XAML del lenguaje XAML normalmente se asigna mediante el prefijo x. Puedes definir un espacio de nombres XAML predeterminado, donde el prefijo no se proporciona en la definición, pero se representa como una cadena vacía si se define o consulta por la API de servicios de XAML de .NET. Normalmente, el espacio de nombres XAML predeterminado se elige deliberadamente para promover una cantidad maximizada de marcado que omite el prefijo por una tecnología de implementación XAML y sus escenarios y vocabularios.

El prefijo puede ser cualquier cadena permitida por los espacios de nombres W3C en la especificación XML 1.0. Por convención, los identificadores de los espacios de nombres XML o los espacios de nombres XAML se proporcionan a menudo en forma de URI, normalmente como un URI absoluto calificado por protocolo. A menudo la información de versión que define un vocabulario XAML determinado está implícito como parte de la cadena de ruta de acceso. Los espacios de nombres XAML agregan una convención de identificador adicional más allá de la convención de URI XML. En el caso de los espacios de nombres XAML, el identificador comunica la información que necesita un contexto de esquema XAML para resolver los tipos especificados como elementos en ese espacio de nombres XAML o para resolver atributos a los miembros.

Para comunicar información a un contexto de esquema XAML, es posible que el identificador de un espacio de nombres XAML todavía esté en forma de URI. Sin embargo, en este caso, el URI también se declara como un identificador coincidente en un determinado ensamblado o lista de ensamblados. Esto se hace en ensamblados mediante la atribución del ensamblado con XmlnsDefinitionAttribute. Este método para identificar el espacio de nombres XAML y admitir un comportamiento de resolución de tipos basado en CLR en el ensamblado con atributos es compatible con el contexto de esquema XAML predeterminado en los servicios XAML de .NET. Por lo general, esta convención se puede usar para los casos en los que el contexto de esquema XAML incorpora CLR o se basa en el contexto de esquema XAML predeterminado, que es necesario para leer los atributos CLR de los ensamblados CLR.

Los espacios de nombres XAML también se pueden identificar mediante una convención que comunica un espacio de nombres CLR y un ensamblado que define tipos. Esta convención se usa en los casos en los que no existe ninguna atribución XmlnsDefinitionAttribute en los ensamblados que contienen tipos. Esta convención es potencialmente más compleja que la convención de URI y también tiene el potencial de ambigüedad y duplicación, ya que hay varias formas de hacer referencia a un ensamblado.

La forma más básica de un identificador que usa el espacio de nombres CLR y la convención de ensamblado es la siguiente:

clr-namespace:clrnsName; assembly=assemblyShortName

clr-namespace: y ; assembly= son componentes literales de la sintaxis.

clrnsName es el nombre de cadena que identifica un espacio de nombres CLR. Este nombre de cadena incluye cualquier carácter de punto interno (.) que proporcione sugerencias sobre el espacio de nombres CLR y su relación con otros espacios de nombres CLR.

assemblyShortName es el nombre de cadena de un ensamblado que define los tipos que son útiles en XAML. Se espera que los tipos a los que se va a tener acceso a través del espacio de nombres XAML sean definidos por ensamblado y declarados en el espacio de nombres CLR especificado por clrnsName. Este nombre de cadena normalmente es paralelo a la información notificada por AssemblyName.Name.

Una definición más completa del espacio de nombres y la convención de ensamblado CLR es la siguiente:

clr-namespace:clrnsName; assembly=assemblyName

assemblyName representa cualquier cadena que sea legal como entrada Assembly.Load(String). Esta cadena puede incluir información de referencia cultural, clave pública o versión (las definiciones de estos conceptos se definen en el tema de referencia para Assembly). El formato y la evidencia de COFF (como usan otras sobrecargas de Load) no son relevantes para los propósitos de carga de ensamblados XAML; toda la información de carga debe presentarse como una cadena.

Especificar una clave pública para el ensamblado es una técnica útil para la seguridad XAML o para eliminar la posible ambigüedad que puede existir si los ensamblados se cargan por un nombre simple o existen previamente en una memoria caché o dominio de aplicación. Para obtener más información, vea XAML Security Considerations.

Declaraciones de espacio de nombres XAML en la API de servicios XAML

En la API de servicios XAML, una declaración de espacio de nombres XAML se representa mediante un objeto NamespaceDeclaration. Si se declara un espacio de nombres XAML en el código, se llama al constructor NamespaceDeclaration(String, String). Los parámetros ns y prefix se especifican como cadenas, y la entrada que se va a proporcionar para estos parámetros corresponde a la definición del identificador de espacio de nombres XAML y el prefijo del espacio de nombres XAML, tal como se ha proporcionado anteriormente en este tema.

Si examina la información del espacio de nombres XAML como parte de un flujo de nodo XAML o a través de otro acceso al sistema de tipos XAML, NamespaceDeclaration.Namespace notifica el identificador del espacio de nombres XAML y NamespaceDeclaration.Prefix informa del prefijo del espacio de nombres XAML.

En un flujo de nodo XAML la información del espacio de nombres XAML puede aparecer como un nodo XAML que precede a la entidad a la que se aplica. Esto incluye casos en los que la información del espacio de nombres XAML precede al StartObject del elemento raíz de XAML. Para obtener más información, consulta Understanding XAML Node Stream Structures and Concepts.

Para muchos escenarios que usan la API de servicios XAML de .NET, se espera que exista al menos una declaración de espacio de nombres XAML, y que la declaración contenga o haga referencia a información necesaria para un contexto de esquema XAML. Los espacios de nombres XAML deben especificar ensamblados que se van a cargar, o bien ayudar a resolver tipos específicos dentro de espacios de nombres y ensamblados que ya están cargados o conocidos por el contexto de esquema XAML.

Para generar un flujo de nodo XAML, la información de tipo XAML debe estar disponible a través del contexto de esquema XAML. La información de tipo XAML no se puede determinar sin determinar primero el espacio de nombres XAML pertinente para cada nodo que se va a crear. En este momento todavía no se crean instancias de tipos, pero es posible que el contexto de esquema XAML tenga que buscar información en el ensamblado de definición y del tipo de respaldo. Por ejemplo, para procesar el marcado <Party><PartyFavor/></Party>, el contexto de esquema XAML debe ser capaz de determinar el nombre y el tipo de ContentProperty o Party y, por lo tanto, también debe conocer la información del espacio de nombres XAML para Party y PartyFavor. En el caso del contexto de esquema XAML predeterminado, la reflexión estática notifica gran parte de la información del sistema de tipos XAML necesaria para generar nodos de tipo XAML en el flujo de nodos.

Para generar un gráfico de objetos a partir de un flujo de nodo XAML, las declaraciones de espacio de nombres XAML deben existir para cada prefijo XAML usado en el marcado original y registrado en el flujo de nodo XAML. En este momento se crean instancias y se produce un verdadero comportamiento de asignación de tipos.

Si se necesita rellenar previamente la información del espacio de nombres XAML, en los casos en los que el espacio de nombres XAML que piensa usar no está definido en el marcado, una técnica que se puede usar es declarar declaraciones de espacio de nombres XML en el XmlParserContext para un XmlReader. Después, use ese XmlReader como entrada para un constructor de lector XAML o XamlServices.Load(XmlReader).

Otras dos API que son relevantes para el control del espacio de nombres XAML en los servicios XAML de .NET son los atributos XmlnsDefinitionAttribute y XmlnsPrefixAttribute. Estos atributos se aplican a los ensamblados. XmlnsDefinitionAttribute se usa en un contexto de esquema XAML para interpretar cualquier declaración de espacio de nombres XAML que incluya un URI. XmlnsPrefixAttribute se usa en herramientas que emiten XAML para que se pueda serializar un espacio de nombres XAML determinado con un prefijo predecible. Para obtener más información, consulte Atributos CLR relacionados con XAML para tipos y bibliotecas personalizados.

Vea también