Compartir a través de


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

Los autores de los tipos que admiten los usos de extensión de marcado y convertidor de tipos deben tener a menudo la información contextual sobre el lugar donde se encuentra un uso en el marcado, o para rodear la estructura del gráfico de objeto. Se podría necesitar información para crear correctamente instancias del objeto proporcionado o para que se puedan realizar las referencias a objeto para los objetos existentes en el gráfico de objeto. Al utilizar los Servicios XAML de .NET Framework, el contexto que se podría requerir se expone como una serie de interfaces de servicio. El código auxiliar de convertidor de tipos o extensión de marcado puede consultar un servicio mediante un contexto de proveedor de servicios que está disponible y se pasa a través de XamlObjectWriter o los tipos relacionados. El contexto del esquema XAML está disponible directamente a través de este servicio. En este tema se describe cómo tener acceso a los contextos del servicio desde una implementación del convertidor de valores, y se hace una lista de los servicios típicamente disponibles y sus roles.

Este tema contiene las secciones siguientes.

  • Obtener servicios
  • Servicios para una extensión de marcado
  • Servicios para un convertidor de tipos
  • Servicios para un serializador de valor
  • Usar los contextos de proveedor de servicios XAML
  • Servicios disponibles en el contexto de servicio XAML de .NET Framework
  • Temas relacionados

Obtener servicios

Como implementador de un convertidor de valores, a menudo necesitará obtener acceso a algún tipo de contexto en el que se aplique el convertidor de valores. Este contexto podría incluir información como el contexto de esquema XAML activo, 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 extensión de marcado o la implementación del convertidor de tipos se comunican a través de los parámetros de contexto que forman parte de la firma de cada método virtual. En cada caso, tiene IServiceProvider implementado en el contexto y puede llamar a IServiceProvider.GetService para solicitar un servicio.

Servicios para una extensión de marcado

MarkupExtension tiene sólo un método virtual, ProvideValue. El parámetro serviceProvider de entrada es la forma en que los servicios se comunican con las implementaciones cuando un procesador de XAML llama a la extensión de marcado. El siguiente pseudocódigo muestra cómo una implementación de la extensión de marcado podría consultar los servicios en 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 del servicio y admiten los usos de XAML. Cada uno de estos métodos pasa un parámetro context de entrada. Este parámetro es del tipo ITypeDescriptorContext, pero esa interfaz hereda IServiceProvider y, por lo tanto, hay un método GetService disponible para las implementaciones del convertidor de tipos.

El siguiente pseudocódigo muestra cómo una implementación del convertidor de tipos para los usos de XAML podría consultar los servicios en 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 de ValueSerializer. Llame a GetService desde el contexto para obtener los servicios.

Usar los contextos de proveedor de servicios XAML

El proveedor de servicios para el acceso de GetService a los servicios XAML disponible para las extensiones de marcado o los convertidores de tipos se implementa como una clase interna, con exposición solo a través de la interfaz y a la manera en que se pasa en el contexto pertinente. En las implementaciones predeterminadas de los Servicios XAML de .NET Framework de la ruta de acceso de carga o la ruta de acceso de guardar, se pasa este objeto interno cada vez que una operación del procesamiento XAML invoca a la extensión de marcado pertinente o a los métodos de convertidor de tipos que requieren un contexto de servicio. 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. Su interacción con estas clases se limita a solicitar sus servicios, a través de GetService.

Servicios disponibles en el contexto de servicio XAML de .NET Framework

Los Servicios XAML de .NET Framework definen los servicios para las extensiones de marcado, convertidores de tipos, serializadores de valor, y potencialmente otros usos. En las siguientes secciones se describe cada uno de estos servicios y se proporciona orientación sobre cómo se podría usar el servicio en una implementación.

IServiceProvider

Documentación de referencia: IServiceProvider

Pertinente a: la operación básica de una infraestructura basada en servicios de .NET Framework, para que pueda llamar a IServiceProvider.GetService.

ITypeDescriptorContext

Documentación de referencia: ITypeDescriptorContext

Se deriva de IServiceProvider. Esta clase representa el contexto en las firmas de TypeConverter estándar; TypeConverter es una clase que ha existido desde .NET Framework versión 1.0. Es anterior al XAML y al escenario TypeConverter de XAML para la conversión de tipos de valor y cadena. En el contexto de los Servicios XAML de .NET Framework, los métodos de TypeConverter se implementan explícitamente. El comportamiento de la implementación explícita indica a los llamadores que la API de ITypeDescriptorContext no es pertinente para los sistemas de tipos XAML ni para leer o escribir objetos desde XAML. Container, Instance y PropertyDescriptor generalmente devuelven null en los contextos de los Servicios XAML de .NET Framework.

IValueSerializerContext

Documentación de referencia: IValueSerializerContext

Se deriva de ITypeDescriptorContext y también confía en las implementaciones explícitas para suprimir las implicaciones falsas sobre el sistema de tipos XAML. Admite los métodos auxiliares de búsqueda estáticos en ValueSerializer.

IXamlTypeResolver

Documentación de referencia: IXamlTypeResolver

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

Pertinente a: los escenarios de ruta de acceso de carga e interacción con el contexto de esquema XAML

API de servicio: Resolve

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

IUriContext

Documentación de referencia: IUriContext

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

Pertinente a: el control de la ruta de acceso de carga y de la ruta de acceso de guardar de los valores de miembro que son valores de URI o x:Uri.

API de servicio: BaseUri

Este servicio notifica una raíz de URI globalmente disponible, si existe. La raíz de URI se puede usar para resolver los URI relativos como URI absolutos o viceversa. Este escenario es principalmente pertinente para los servicios de aplicación expuestos por un marco determinado o para las capacidades de una clase de elemento raíz utilizada frecuentemente en un marco. El identificador URI base se puede establecer como un valor de lector de XAML, que este servicio pasa a continuación al sistema de escritura de objetos XAML y lo notifica.

IAmbientProvider

Documentación de referencia: IAmbientProvider

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

Pertinente a: el control de la ruta de acceso de carga y los aplazamientos u optimizaciones de búsqueda de tipos.

API de servicio: GetAllAmbientValues, 3 más.

El concepto del ambiente en XAML es una técnica para marcar un miembro determinado de un tipo como ambiente. Alternativamente, un tipo puede ser un ambiente de tal forma que todos los valores de propiedad que contienen una instancia del tipo deberían considerarse propiedades de ambiente. Las extensiones de marcado o convertidores de tipos que son más extensos a lo largo del flujo de nodo XAML y que son descendientes en el gráfico de objeto pueden obtener acceso a la propiedad de ambiente o instancia de tipo en el momento de la carga; o pueden usar el conocimiento de la estructura de ambiente en el momento de guardar. Esto puede afectar al grado de calificación necesario para resolver los tipos para otros servicios; por ejemplo para IXamlTypeResolver o para x:Type. Vea también AmbientPropertyValue.

IXamlSchemaContextProvider

Documentación de referencia: IXamlSchemaContextProvider

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

Pertinente a: la ruta de acceso de carga y cualquier operación que deba resolver un tipo XAML como un tipo de respaldo.

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 obtener más información sobre el rol del contexto de esquema XAML, vea Servicios XAML.

IRootObjectProvider

Documentación de referencia: IRootObjectProvider

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

Pertinente a: la ruta de acceso de carga.

API de servicio: RootObject

El servicio es pertinente para los servicios de aplicación expuestos por un marco determinado o por las capacidades de una clase de elemento raíz utilizada frecuentemente en un marco. Un escenario para obtener el objeto raíz conecta el código subyacente y la conexión de eventos. Por ejemplo, la implementación WPF de x:Class se usa para la compilación de marcado y la conexión de cualquier atributo de controlador de eventos que se encuentre en cualquier otra posición en el marcado XAML. El punto de conexión del marcado y las clases parciales definidas por el código subyacente para la compilación del marcado se encuentran en el elemento raíz.

IXamlNamespaceResolver

Documentación de referencia: IXamlNamespaceResolver

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

Pertinente a: la ruta de acceso de carga, la ruta de acceso de guardar.

API de servicio: GetNamespace para la ruta de acceso de carga, GetNamespacePrefixes para la ruta de acceso de guardar.

IXamlNamespaceResolver es un servicio que puede devolver un identificador del espacio de nombres de XAML o URI basado en su prefijo tal como se asigna en el marcado XAML original.

IProvideValueTarget

Documentación de referencia: IProvideValueTarget

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

Pertinente a: la ruta de acceso de carga y la ruta de acceso de guardar.

API de servicio: TargetObject, TargetProperty.

IProvideValueTarget permite a un convertidor de tipos o una extensión de marcado obtener el contexto donde está actuando en el momento de la carga. Las implementaciones podrían usar este contexto para invalidar un uso. Por ejemplo, WPF tiene lógica dentro de algunas de sus extensiones de marcado como DynamicResourceExtension. La lógica comprueba TargetProperty para garantizar que la extensión solo se utiliza para establecer las propiedades de dependencia (o una lista breve de otras propiedades de no dependencia).

IXamlNameResolver

Documentación de referencia: IXamlNameResolver

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

Pertinente a: la definición del gráfico de objeto de la ruta de acceso de carga, la resolución de objetos identificados por x:Name, x:Reference o las técnicas específicas del marco.

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

La implementación de los Servicios XAML de .NET Framework del control de x:Reference confía en este servicio. Los marcos o herramientas concretos que admiten el marco usan este servicio para el control de x:Name o el control de propiedades equivalentes (RuntimeNamePropertyAttribute con atributos).

IDestinationTypeProvider

Documentación de referencia: IDestinationTypeProvider

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

Pertinente a: la resolución de la ruta de acceso de carga de la información de tipos CLR indirecta.

API de servicio:GetDestinationType

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

Vea también

Referencia

MarkupExtension

XamlObjectWriter

Otros recursos

Información general sobre las extensiones de marcado para el lenguaje XAML

Información general sobre los convertidores de tipos para XAML