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, 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 XAML predeterminado
Los servicios XAML de .NET implementan y usan un contexto de esquema XAML predeterminado. El comportamiento predeterminado del contexto de esquema XAML no siempre es totalmente visible en la API de la clase XamlSchemaContext. Sin embargo, en muchos casos, el comportamiento 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 API expuestas en lectores XAML y escritores XAML que usan el contexto de esquema XAML predeterminado.
Puede crear un 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 inicializa un lector XAML o un escritor XAML mediante API que no toman explícitamente un parámetro de entrada de XamlSchemaContext.
El contexto de esquema XAML predeterminado se basa en la reflexión CLR para su comportamiento de asignación de tipos. Esto incluye examinar la definición de clR Typey PropertyInfo relacionados o MethodInfo. Además, la atribución de CLR en tipos o miembros se usa para rellenar los detalles del tipo XAML o la información de miembro 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 de 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 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 en los que hay propiedades de contenido XAML que funcionan sin tener ContentPropertyAttribute atributos. LookupContentProperty invalidaciones para WPF implementan este comportamiento.
aplazamiento para expresiones de WPF: WPF cuenta con 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 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 los tipos no existen 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 propiedades con propiedades de dependencia y conceptos de eventos con eventos enrutados. Para proporcionar a estos conceptos mayor visibilidad de las operaciones de procesamiento XAML, WPF amplía 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 el System.Windows.Markup.XamlReader o System.Windows.Markup.XamlWriterde WPF, el contexto de esquema XAML de WPF ya está en uso en esas implementaciones de lector XAML y escritor XAML.
Si usas otras implementaciones del lector XAML o del escritor XAML que no se inicializan con el contexto de esquema XAML de WPF, es posible que puedas obtener un contexto de esquema XAML de WPF en funcionamiento de XamlReader.GetWpfSchemaContext. A continuación, puede usar este valor como inicialización para otras API que usan un XamlSchemaContext. Por ejemplo, podría llamar a XamlXmlReader para la inicialización y pasar el contexto de esquema XAML de WPF. O bien, puedes usar el contexto de esquema XAML de WPF para las operaciones del sistema de tipos XAML. Esto puede incluir la inicialización de la construcción de un XamlType o XamlMember, o llamar a XamlSchemaContext.GetXamlType.
Tenga en cuenta que si accedes a ciertos aspectos de XAML de WPF desde una perspectiva pura de flujo de nodo XAML, es posible que algunas de las funcionalidades del marco wpF aún no hayan actuado. Por ejemplo, las plantillas de WPF para los controles aún no se aplican. 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 wpF tampoco sea preciso si se proporciona desde una situación que no es en tiempo de ejecución y puede dar lugar a excepciones al intentar escribir un gráfico de objetos.
Carga de ensamblados y XAML
La carga de ensamblados para servicios XAML y .NET XAML se integra con el concepto definido por CLR de AppDomain. Un contexto de esquema XAML interpreta cómo cargar ensamblados o buscar tipos en tiempo de ejecución o tiempo de diseño, en función del 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 XAML en un archivo DLL mediante XamlBuildTask
, o es BAML generado por la PresentationBuildTask
de WPF.
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 del lector XAML (XAML flexible)
El contexto de esquema XAML recorre en iteración la AppDomain de la aplicació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.
De lo contrario, se usa una de las técnicas siguientes basadas en CLR Assembly API para cargar un ensamblado:
Si el nombre está calificado en la asignación, llame a Assembly.Load(String) en el nombre completo.
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).
Si el nombre no está completo en la asignación, llame a Assembly.LoadWithPartialName.
XamlBuildTask
XamlBuildTask
se usa para Windows Communication Foundation (WCF) y Windows Workflow Foundation.
Tenga en cuenta que las referencias de ensamblado a través de XamlBuildTask
siempre están completas.
Llame a Assembly.Load(String) en el nombre completo.
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 los tipos a los que hace referencia la producción baml.
Carga del ensamblado para el marcado inicial:
La referencia al ensamblado desde la que se va a cargar el marcado siempre no está calificada.
El contexto de esquema XAML de WPF recorre en iteración la AppDomain de la aplicación WPF, 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.
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 de BAML siempre están completos, como salida de la tarea de compilación.
El contexto de esquema XAML de WPF recorre en iteración la AppDomain de la aplicación WPF, 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.
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 tokens de clave pública + nombre corto coincide con el ensamblado desde el que se cargó bamL, use ese ensamblado.
Use el nombre corto + token de clave pública para llamar a Assembly.Load(String).
Consulte también
.NET Desktop feedback