Contexto de esquema XAML predeterminado y contexto de esquema XAML de WPF

Un contexto de esquema XAML es una entidad conceptual que califica cómo una producción XAML que usa un vocabulario XAML determinado interactúa con el comportamiento de escritura de objetos, incluido cómo se resuelve la asignación de tipos, cómo se cargan los ensamblados y cómo se interpretan determinados valores de lector y escritor. En este tema se describen las características de los servicios XAML de .NET y el contexto de esquema XAML predeterminado asociado, que se basa en el sistema de tipos CLR. En este tema también se describe el contexto de esquema XAML que se usa para WPF.

Contexto de esquema de XAML predeterminado

Los servicios XAML de .NET implementan y usan un contexto de esquema XAML predeterminado. El comportamiento del contexto de esquema XAML predeterminado no siempre es totalmente visible en la API de la clase XamlSchemaContext. Sin embargo, en muchos casos, el comportamiento en el que influye el contexto de esquema XAML predeterminado es observable a través de la API común del sistema de tipos XAML, como los miembros de XamlMember o XamlType, o a través de las API expuestas en lectores XAML y escritores XAML que usan el contexto de esquema XAML predeterminado.

Puede crear un objeto XamlSchemaContext que encapsula el comportamiento predeterminado llamando al constructor XamlSchemaContext. Esto crea explícitamente el contexto de esquema XAML predeterminado. El mismo contexto de esquema XAML predeterminado se crea implícitamente si se inicializa un lector XAML o un escritor XAML mediante API que no toman un parámetro de entrada XamlSchemaContext explícitamente.

El contexto de esquema XAML predeterminado se basa en la reflexión CLR para su comportamiento de asignación de tipos. Esto incluye el examen de la definición de CLR Type y los relacionados con este, PropertyInfo o MethodInfo. Además, la atribución de CLR en tipos o miembros se usa para rellenar los detalles de la información de tipos XAML o miembros XAML que usa el tipo de respaldo CLR. El contexto de esquema XAML predeterminado no requiere técnicas de extensión del sistema de tipos como el patrón Invoker, ya que la información necesaria está disponible en el sistema de tipos CLR.

Para la lógica de carga de ensamblados, el contexto de esquema XAML predeterminado se basa principalmente en los valores de ensamblado proporcionados en las asignaciones de espacios de nombres XAML. Además, LocalAssembly puede sugerir a un ensamblado que se cargue, en escenarios como la carga de tipos internos.

Contexto de esquema de XAML de WPF

El contexto de esquema XAML de WPF se describe en este tema porque la implementación de WPF proporciona una ilustración interesante de los tipos de características que se pueden introducir mediante la implementación de un contexto de esquema XAML no predeterminado. Además, el concepto de contexto de esquema XAML no se analiza mucho en la documentación de WPF que aborda XAML de WPF; el comportamiento que habilita el contexto de esquema XAML solo puede ser totalmente comprensible si se integra con una explicación de cómo funciona el contexto de esquema XAML predeterminado. El contexto de esquema XAML de WPF implementa el siguiente comportamiento.

Invalidaciones de búsqueda: WPF tiene algunos modelos de contenido para XAML donde hay propiedades de contenido XAML que funcionan sin atribuirse ContentPropertyAttribute. Las invalidaciones LookupContentProperty para WPF implementan este comportamiento.

Aplazamiento para expresiones de WPF: WPF incluye varias clases de expresión que aplazan un valor hasta que haya un contexto en tiempo de ejecución disponible. Además, la expansión de plantillas es un comportamiento en tiempo de ejecución que se basa en técnicas de aplazamiento.

Optimizaciones de búsqueda del sistema de tipos: WPF tiene un amplio vocabulario XAML y un modelo de objetos, incluidas las definiciones de miembros de clase base que heredan a literalmente cientos de clases definidas por WPF. Además, WPF se distribuye entre varios ensamblados. WPF optimiza su búsqueda de tipos mediante tablas de búsqueda y otras técnicas. Esto proporciona mejoras de rendimiento sobre el contexto de esquema XAML predeterminado y su búsqueda de tipos basada en CLR. En los casos en los que un tipo no existe en una tabla de búsqueda, el comportamiento usa técnicas de contexto de esquema XAML similares al contexto de esquema XAML predeterminado.

Extensión XamlType y XamlMember: WPF amplía los conceptos de propiedad con propiedades de dependencia y conceptos de eventos con eventos enrutados. Para dar mayor visibilidad a estos conceptos para las operaciones de procesamiento XAML, WPF extiende XamlType y XamlMember y agrega propiedades internas que notifican características de evento enrutadas y propiedad de dependencia.

Acceso al contexto de esquema XAML de WPF

Si usa técnicas XAML basadas en WPF System.Windows.Markup.XamlReader o System.Windows.Markup.XamlWriter, el contexto de esquema XAML de WPF ya está en uso en esas implementaciones de lector XAML y escritor XAML.

Si usa otras implementaciones de lector XAML o escritor XAML que no se inicializan con el contexto de esquema XAML de WPF, es posible que pueda obtener un contexto de esquema XAML de WPF funcional desde XamlReader.GetWpfSchemaContext. Después, puede usar este valor como inicialización para otras API que usen un XamlSchemaContext. Por ejemplo, podría llamar a XamlXmlReader para la inicialización y pasar el contexto de esquema XAML de WPF. O bien, puede usar el contexto de esquema XAML de WPF para las operaciones del sistema de tipos XAML. Esto puede incluir la inicialización de construcción de un XamlType o XamlMember, o una llamada a XamlSchemaContext.GetXamlType.

Tenga en cuenta que si accede a ciertos aspectos de XAML de WPF desde una pura perspectiva de flujo de nodo XAML, es posible que algunas de las funcionalidades del marco de WPF aún no hayan actuado. Por ejemplo, aún no se aplican plantillas de WPF para controles. Por lo tanto, si tiene acceso a una propiedad que en tiempo de ejecución podría rellenarse con un árbol visual completo, es posible que solo vea un valor de propiedad que haga referencia a una plantilla. Es posible que el contexto de servicio proporcionado para las extensiones de marcado de WPF tampoco sea preciso si se proporciona desde una situación que no es de tiempo de ejecución, lo que puede dar lugar a excepciones al intentar escribir un gráfico de objetos.

WPF y carga de ensamblados

La carga de ensamblados para XAML y los servicios XAML de .NET se integra con el concepto de AppDomain definido por CLR. Un contexto de esquema XAML interpreta cómo cargar ensamblados o buscar tipos en tiempo de ejecución o en tiempo de diseño basándose en el uso de AppDomain y otros factores. La lógica es ligeramente diferente en función de si el XAML es XAML flexible para un lector XAML, se compila en un archivo DLL mediante XamlBuildTask o es BAML generado por WPFPresentationBuildTask.

El contexto de esquema XAML para WPF se integra con el modelo de aplicación de WPF, que a su vez usa AppDomain, así como otros factores que son detalles de implementación de WPF.

Entrada de lector XAML (XAML flexible)

  1. El contexto de esquema XAML recorre el AppDomain de la aplicación en iteración buscando un ensamblado ya cargado que coincida con todos los aspectos del nombre, empezando por el ensamblado cargado más recientemente. Si se encuentra una coincidencia, ese ensamblado se usa para la resolución.

  2. De lo contrario, se usa una de las técnicas siguientes basadas en la API de CLR Assembly para cargar un ensamblado:

XamlBuildTask

XamlBuildTask se usa para Windows Communication Foundation (WCF) y Windows Workflow Foundation.

Tenga en cuenta que las referencias de ensamblado a través XamlBuildTask de siempre están completas.

  1. Llame a Assembly.Load(String) en el nombre completo.

  2. Si se produce un error en el paso anterior, use el nombre corto (y el token de clave pública si está presente) para llamar a Assembly.Load(String).

BAML (PresentationBuildTask)

Hay dos aspectos para la carga de ensamblados para BAML: cargar el ensamblado inicial que contiene BAML como componente y cargar los ensamblados de respaldo de tipos para cualquier tipo al que haga referencia la producción BAML.

Carga de ensamblados para el marcado inicial:

La referencia al ensamblado desde la que se va a cargar el marcado siempre está incompleta.

  1. El contexto de esquema XAML de WPF recorre el AppDomain de la aplicación WPF en iteración buscando un ensamblado ya cargado que coincida con todos los aspectos del nombre, empezando por el ensamblado cargado más recientemente. Si se encuentra una coincidencia, ese ensamblado se usa para la resolución.

  2. Si se produce un error en el paso anterior, use el nombre corto (y el token de clave pública si está presente) para llamar a Assembly.Load(String).

Referencias de ensamblado por tipos BAML:

Las referencias de ensamblado para los tipos usados en la producción BAML siempre están completas, como salida de la tarea de compilación.

  1. El contexto de esquema XAML de WPF recorre el AppDomain de la aplicación WPF en iteración buscando un ensamblado ya cargado que coincida con todos los aspectos del nombre, empezando por el ensamblado cargado más recientemente. Si se encuentra una coincidencia, ese ensamblado se usa para la resolución.

  2. De lo contrario, se usa una de las técnicas siguientes para cargar un ensamblado:

    • Llame a Assembly.Load(String) en el nombre completo.

    • Si una combinación de nombre corto + token de clave pública coincide con el ensamblado desde el que se ha cargado BAML, use ese ensamblado.

    • Use el nombre corto + el token de clave pública para llamar a Assembly.Load(String).

Vea también