Contextos de servicio disponibles para los convertidores de tipos y las extensiones de marcado

Los autores de los tipos que admiten los usos de la extensión de marcado y el convertidor de tipos deben tener a menudo la información contextual sobre dónde se encuentra un uso en el marcado o en la estructura gráfica del objeto adyacente. Puede ser necesaria cierta información para que se cree una instancia correcta del objeto proporcionado o para que puedan crearse referencias a objetos existentes del gráfico del objeto. Al usar los servicios XAML de .NET, el contexto que puede ser necesario se expone como una serie de interfaces de servicio. El código de soporte de la extensión de marcado o el convertidor de tipos puede consultar un servicio usando un contexto de proveedor de servicio que esté disponible y se haya pasado desde XamlObjectWriter o tipos relacionados. El contexto de esquema XAML está disponible directamente con uno de estos servicios. En este tema se describe cómo acceder a los contextos de servicio desde una implementación de convertidor de valor y se enumeran los servicios normalmente disponibles y sus funciones.

Obtener servicios

Como implementador de un convertidor de valores, suele necesitar acceder a algún tipo de contexto en el que se aplica el convertidor de valores. Este contexto puede incluir información como el contexto de esquema de XAML activo, el acceso al sistema de asignación de tipos que proporcionan el contexto de esquema XAML y el escritor de objetos XAML, etc. Los servicios disponibles para una implementación de convertidor de tipos o extensión de marcado se comunican con los parámetros de contexto que forman parte de la firma de cada método virtual. En todos los casos, IServiceProvider debe estar implementado en el contexto y puede llamar a IServiceProvider.GetService para pedir un servicio.

Servicios para una extensión de marcado

MarkupExtension solo tiene un método virtual, ProvideValue. El parámetro de entrada serviceProvider indica cómo se comunican los servicios a las implementaciones cuando un procesador XAML llama a la extensión de marcado. En el siguiente pseudocódigo se muestra cómo una implementación de extensión de marcado puede consultar los servicios en su ProvideValue:

public override object ProvideValue(IServiceProvider serviceProvider)
{
    //...
    // Get the IXamlTypeResolver from the service provider
    if (serviceProvider == null)
    {
        throw new ArgumentNullException("serviceProvider");
    }
    IXamlTypeResolver xamlTypeResolver = serviceProvider.GetService(typeof(IXamlTypeResolver)) as IXamlTypeResolver;
    if (xamlTypeResolver == null)
    {
        throw new ArgumentException("IXamlTypeResolver");
    }
    //...
}

Servicios para un convertidor de tipos

TypeConverter tiene cuatro métodos virtuales que usan un contexto de servicio y que admiten usos XAML. Cada uno de estos métodos pasa un parámetro de entrada context . Este parámetro es de tipo ITypeDescriptorContext, pero esa interfaz hereda IServiceProvider; por lo tanto, hay un método GetService disponible para implementaciones de convertidor de tipos.

En el siguiente pseudocódigo se muestra cómo una implementación de convertidor de tipos para usos XAML puede consultar los servicios de una de sus invalidaciones, en este caso ConvertFrom:

public override object ConvertFrom(ITypeDescriptorContext typeDescriptorContext,
  CultureInfo cultureInfo,
  object source)
{
    IRootObjectProvider rootProvider = typeDescriptorContext.GetService(typeof(IRootObjectProvider)) as IRootObjectProvider;
    if (rootProvider != null && source is String)
    {
        //return something, else ...
    }
    throw GetConvertFromException(source);
}

Servicios para un serializador de valor

Para el contexto de serializador de valor, se usa un tipo de proveedor de servicios que es específico de la clase ValueSerializer , IValueSerializerContext. Ese contexto se pasa a las invalidaciones de los cuatro métodos virtuales ValueSerializer . Llame a GetService desde el contexto para obtener servicios.

Uso de los contextos de proveedor de servicio XAML

El proveedor de servicios para el acceso de GetService a los servicios XAML disponibles para las extensiones de marcado o los convertidores de tipos se implementa como una clase interna, con exposición solo en la interfaz y en cómo se pasa al contexto pertinente. Siempre que una operación de procesamiento de XAML en las implementaciones predeterminadas de servicios XAML de .NET de ruta de acceso de carga o ruta de acceso de almacenamiento invoca los métodos pertinentes de convertidor de tipos o extensión de marcado que requieren un contexto de servicio, se pasa este objeto interno. Dependiendo de las circunstancias, el contexto de servicio del sistema proporciona MarkupExtensionContext o TextSyntaxContext, pero las características específicas de ambas clases son internas. La interacción con estas clases se limita a pedir servicios desde ellas con GetService.

Servicios disponibles desde el contexto de servicio XAML de .NET

Los servicios XAML de .NET definen los servicios para las extensiones de marcado, los convertidores de tipos, los serializadores de valor y otros usos potenciales. En las secciones siguientes se describe cada uno de estos servicios y se proporcionan instrucciones sobre cómo usarlos en una implementación.

IServiceProvider

Documentación de referencia: IServiceProvider

Relevante para: operación básica de una infraestructura en .NET basada en servicios para que se pueda llamar a IServiceProvider.GetService.

ITypeDescriptorContext

Documentación de referencia: ITypeDescriptorContext

Deriva de IServiceProvider. Esta clase representa el contexto de las firmas estándares TypeConverter ; TypeConverter es una clase que existe desde .NET Framework 1.0. Es anterior a XAML y el escenario XAML TypeConverter para la conversión de tipo de valor de cadena. En el contexto de los servicios XAML de .NET, los métodos de TypeConverter se implementan de forma explícita. El comportamiento de la implementación explícita indica a los llamadores que la API ITypeDescriptorContext no es relevante para los sistemas de tipos XAML ni para leer o escribir objetos desde XAML. Container, Instance y PropertyDescriptor generalmente devuelven null de los contextos de los servicios XAML de .NET.

IValueSerializerContext

Documentación de referencia: IValueSerializerContext

Se deriva de ITypeDescriptorContext y también se basa en las implementaciones explícitas para suprimir las implicaciones falsas sobre el sistema de tipos XAML. Admite los métodos del asistente de búsqueda estática en ValueSerializer.

IXamlTypeResolver

Documentación de referencia: IXamlTypeResolver

Definida por:System.Windows.Markup espacio de nombres, ensamblado System.Xaml

Relevante para: escenarios de ruta de acceso de carga y la interacción con el contexto de esquema XAML

API de servicio:Resolve

Puede influir en la asignación de tipo XAML a CLR que es necesaria cuando el escritor de XAML construye un objeto CLR en un gráfico de objetos. Resolve procesa una cadena potencialmente calificada con prefijo que corresponde a un nombre de tipo XAML (XamlType.Name) y devuelve un CLR Type. La resolución de los tipos depende normalmente y en gran medida del contexto de esquema XAML. Solo el contexto de esquema XAML conoce consideraciones como qué ensamblados se cargan y a cuáles de estos ensamblados se puede o se debe acceder para la resolución de tipo.

IUriContext

Documentación de referencia: IUriContext

Definida por:System.Windows.Markup espacio de nombres, ensamblado System.Xaml

Relevante para: tratar rutas de acceso de carga y guardado de valores de miembro que son URI o valores x:Uri .

API de servicio:BaseUri

Este servicio notifica una raíz URI disponible globalmente, si existe. La raíz URI puede usarse para resolver los URI relativos como URI absolutos o viceversa. Este escenario es principalmente relevante para los servicios de aplicación expuestos por un marco determinado o para las capacidades de una clase de elemento raíz usada con frecuencia en un marco. El URI base se puede establecer como una opción de lector XAML que se pasa a la escritura de objeto XAML y es notificada por este servicio.

IAmbientProvider

Documentación de referencia: IAmbientProvider

Definida por:System.Xaml espacio de nombres, ensamblado System.Xaml

Relevante para: el tratamiento de rutas de acceso de carga y aplazamientos de búsquedas de control u optimizaciones.

API de servicio:GetAllAmbientValues, otras tres.

El concepto de ambiente en XAML es una técnica para marcar a un miembro determinado de un tipo como ambiente. Como alternativa, un tipo puede ser ambiente para que todos los valores de propiedad que contienen una instancia del tipo se consideren propiedades de ambiente. Las extensiones de marcado o los convertidores de tipos que son más adelante el flujo de nodo XAML y que son descendientes del gráfico de objetos pueden acceder a la propiedad de ambiente o instancia de tipo en tiempo de carga; o bien, puede usar el conocimiento de la estructura de ambiente en el momento de guardar. Esto puede afectar al grado de calificación que se necesita para resolver tipos para otros servicios, como IXamlTypeResolver o x:Type. Consulte también AmbientPropertyValue.

IXamlSchemaContextProvider

Documentación de referencia: IXamlSchemaContextProvider

Definida por:System.Xaml espacio de nombres, ensamblado System.Xaml

Relevante para: ruta de acceso de carga y cualquier operación que deba resolver un tipo XAML como un tipo de copia de seguridad.

API de servicio:SchemaContext

El contexto de esquema XAML es necesario para las operaciones de carga diferidas porque el mismo contexto del esquema debe actuar sobre el área diferida para integrar el contenido diferido. Para más información sobre la función del contexto de esquema XAML, vea XAML Services.

IRootObjectProvider

Documentación de referencia: IRootObjectProvider

Definida por:System.Xaml espacio de nombres, ensamblado System.Xaml

Relevante para: ruta de acceso de carga.

API de servicio:RootObject

Este escenario es relevante para los servicios de aplicación expuestos por un marco determinado o por las capacidades de una clase de elemento raíz usada con frecuencia en un marco. Un escenario para obtener el objeto raíz es la conexión con el código subyacente y la conexión de eventos. Por ejemplo, la implementación de WPF de x:Class se usa para compilar el marcado y conectar cualquier atributo de controlador de eventos que se encuentra en cualquier otra posición del marcado XAML. El punto de conexión de las clases parciales definidas por el código subyacente y el marcado para la compilación del marcado está en el elemento raíz.

IXamlNamespaceResolver

Documentación de referencia: IXamlNamespaceResolver

Definida por:System.Xaml espacio de nombres, ensamblado System.Xaml

Relevante para: la ruta de acceso de carga y la ruta de acceso de guardado.

API de servicio:GetNamespace para la ruta de acceso de carga y GetNamespacePrefixes para la ruta de acceso de almacenamiento.

IXamlNamespaceResolver es un servicio que puede devolver un URI/identificador de espacio de nombres XAML basado en su prefijo según se ha asignado en el marcado XAML original.

IProvideValueTarget

Documentación de referencia: IProvideValueTarget

Definida por:System.Windows.Markup espacio de nombres, ensamblado System.Xaml

Relevante para: la ruta de acceso de carga y la ruta de acceso de guardado.h.

API de servicio:TargetObjecty TargetProperty.

IProvideValueTarget permite que una extensión de marcado o tipo de convertidor obtenga el contexto sobre dónde está actuando en tiempo de carga. Las implementaciones pueden usar este contexto para invalidar un uso. Por ejemplo, WPF tiene lógica dentro de algunas de sus extensiones de marcado como DynamicResourceExtension. Las lógica comprueba TargetProperty para asegurarse de que la extensión solo se use para establecer las propiedades de dependencia (o una lista breve de otras propiedades de no dependencia).

IXamlNameResolver

Documentación de referencia: IXamlNameResolver

Definida por:System.Xaml espacio de nombres, ensamblado System.Xaml

Relevante para: definición del gráfico de objeto de la ruta de acceso de carga, resolver objetos identificados por x:Name, x:Referenceo técnicas específicas del marco.

API de servicio:Resolve; otras API para los escenarios más avanzados como el tratamiento de las referencias adelantadas.

La implementación de los servicios XAML de .NET del control de x:Reference se basa en este servicio. Los marcos o las herramientas específicos que admiten el marco usan este servicio para el control de x:Name o el control de propiedades (RuntimeNamePropertyAttribute con atributos) equivalente.

IDestinationTypeProvider

Documentación de referencia: IDestinationTypeProvider

Definida por:System.Xaml espacio de nombres, ensamblado System.Xaml

Relevante para: la resolución de la ruta de acceso de carga de la información de tipo CLR indirecta.

API de servicio:GetDestinationType

Para obtener más información, vea IDestinationTypeProvider.

Vea también