Partilhar via


Contextos de serviço disponíveis para conversores de tipo e extensões de marcação

Os autores dos tipos que suportam usos de conversor de tipo e extensão de marcação geralmente devem ter informações contextuais sobre onde um uso está localizado na marcação ou na estrutura do gráfico de objetos ao redor. As informações podem ser necessárias para que o objeto fornecido seja instanciado corretamente ou para que as referências de objeto a objetos existentes no gráfico de objetos possam ser feitas. Ao usar os Serviços XAML do .NET, o contexto que pode ser necessário é exposto como uma série de interfaces de serviço. Conversor de tipo ou código de suporte de extensão de marcação pode consultar um serviço usando um contexto de provedor de serviços que está disponível e passado de XamlObjectWriter ou tipos relacionados. O contexto do esquema XAML está diretamente disponível por meio de um desses serviços. Este tópico descreve como acessar contextos de serviço a partir de uma implementação de conversor de valor e lista os serviços normalmente disponíveis e suas funções.

Obtenção de Serviços

Como implementador de um conversor de valor, muitas vezes você precisa de acesso a algum tipo de contexto no qual o conversor de valor é aplicado. Esse contexto pode incluir informações como o contexto de esquema XAML ativo, acesso ao sistema de mapeamento de tipos que o contexto de esquema XAML e o gravador de objeto XAML fornecem, e assim por diante. Os serviços disponíveis para uma extensão de marcação ou implementação de conversor de tipo são comunicados através dos parâmetros de contexto que fazem parte da assinatura de cada método virtual. Em todos os casos, você tem IServiceProvider implementado no contexto e pode ligar para IServiceProvider.GetService para solicitar um serviço.

Serviços para uma extensão de marcação

MarkupExtension tem apenas um método virtual, ProvideValue. O parâmetro serviceProvider de entrada é como os serviços são comunicados às implementações quando a extensão de marcação é chamada por um processador XAML. O pseudocódigo a seguir ilustra como uma implementação de extensão de marcação pode consultar serviços em seu 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");
    }
    //...
}

Serviços para um conversor de tipo

TypeConverter tem quatro métodos virtuais que usam um contexto de serviço e que oferecem suporte a usos de XAML. Cada um desses métodos passa uma entrada context parâmetro. Este parâmetro é do tipo ITypeDescriptorContext, mas essa interface herda IServiceProvidere, portanto, há um método GetService disponível para implementações de conversor de tipo.

O pseudocódigo a seguir ilustra como uma implementação de conversor de tipo para usos XAML pode consultar serviços em uma de suas substituições, neste 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);
}

Serviços para um Value Serializer

Para o contexto do serializador de valor, você usa um tipo de provedor de serviços específico para a classe ValueSerializer, IValueSerializerContext. Esse contexto é passado para substituições dos quatro ValueSerializer métodos virtuais. Ligue para GetService a partir do contexto para obter serviços.

Usando os contextos do provedor de serviços XAML

O provedor de serviços para acesso GetService a serviços XAML disponíveis para extensões de marcação ou conversores de tipo é implementado como uma classe interna, com exposição apenas através da interface e como ela é passada para o contexto relevante. Sempre que uma operação de processamento XAML nas implementações padrão dos Serviços XAML .NET de caminho de carga ou caminho de salvamento invoca a extensão de marcação relevante ou os métodos de conversão de tipo que exigem um contexto de serviço, esse objeto interno é passado. Dependendo da circunstância, o contexto de serviço do sistema fornece MarkupExtensionContext ou TextSyntaxContext, mas as especificidades de ambas as classes são internas. A sua interação com estas classes limita-se a solicitar serviços a partir delas, através de GetService.

Serviços disponíveis do contexto de serviço XAML do .NET

Os Serviços XAML do .NET definem serviços para extensões de marcação, conversores de tipo, serializadores de valor e potencialmente outros usos. As seções a seguir descrevem cada um desses serviços e fornecem orientação sobre como o serviço pode ser usado em uma implementação.

IServiceProvider

Documentação de referência: IServiceProvider

Relevante para: Operação básica de uma infraestrutura baseada em serviço no .NET para que você possa chamar IServiceProvider.GetService.

ITypeDescriptorContext

Documentação de referência: ITypeDescriptorContext

Deriva de IServiceProvider. Esta classe representa o contexto no padrão TypeConverter assinaturas; TypeConverter é uma classe que existe desde o .NET Framework 1.0. Ele é anterior ao XAML e ao cenário de TypeConverter XAML para conversão de tipo de cadeia de caracteres. No contexto dos Serviços XAML .NET, os métodos de TypeConverter são implementados explicitamente. O comportamento da implementação explícita indica aos chamadores que a API ITypeDescriptorContext não é relevante para sistemas do tipo XAML ou para ler ou gravar objetos de XAML. Container, Instancee PropertyDescriptor geralmente retornam null de contextos de Serviços XAML .NET.

IValueSerializerContext

Documentação de referência: IValueSerializerContext

Deriva de ITypeDescriptorContext e também depende de implementações explícitas para suprimir falsas implicações sobre o sistema de tipo XAML. Suporta os métodos auxiliares de pesquisa estática em ValueSerializer.

IXamlTypeResolver

Documentação de referência: IXamlTypeResolver

Definido por:System.Windows.Markup namespace, assembly System.Xaml

Relevante para: cenários de caminho de carga e interação com contexto de esquema XAML

API de serviço :Resolve

Pode influenciar o mapeamento de tipo XAML para CLR que é necessário quando o gravador XAML constrói um objeto CLR em um gráfico de objeto. Resolve processa uma cadeia de caracteres potencialmente qualificada por prefixo que corresponde a um nome de tipo XAML (XamlType.Name) e retorna um CLR Type. A resolução de tipos normalmente depende muito do contexto do esquema XAML. Somente o contexto do esquema XAML está ciente de considerações como quais assemblies são carregados e quais desses assemblies podem ou devem ser acessados para resolução de tipo.

IUriContext

Documentação de referência: IUriContext

Definido por:System.Windows.Markup namespace, assembly System.Xaml

Relevante para: Carregar caminho e salvar tratamento de caminho de valores de membro que são URIs ou valores x:Uri.

API de serviço :BaseUri

Este serviço relata uma raiz de URI disponível globalmente, se houver. A raiz de URI pode ser usada para resolver URIs relativos para URIs absolutos ou vice-versa. Esse cenário é principalmente relevante para serviços de aplicativo que são expostos por uma estrutura específica ou recursos de uma classe de elemento raiz usada com freqüência em uma estrutura. O URI base pode ser estabelecido como uma configuração de leitor XAML, que é então passada para o gravador de objeto XAML e relatada por esse serviço.

IAmbientProvider

Documentação de referência: IAmbientProvider

Definido por:System.Xaml namespace, assembly System.Xaml

Relevante para: Manipulação de caminho de carga e adiamentos ou otimizações de pesquisa de tipo.

APIs de serviço:GetAllAmbientValues, três outras.

O conceito de ambiente em XAML é uma técnica para marcar um membro específico de um tipo como ambiente. Como alternativa, um tipo pode ser ambient para que todos os valores de propriedade que contêm uma instância do tipo sejam considerados propriedades ambientais. Extensões de marcação ou conversores de tipo que estão mais ao longo do fluxo do nó XAML e que são descendentes no gráfico de objeto podem acessar a propriedade ambiente ou instância de tipo no tempo de carregamento; ou podem utilizar o conhecimento da estrutura ambiental em tempo útil. Isso pode afetar o grau de qualificação necessário para resolver tipos para outros serviços, como para IXamlTypeResolver ou para x:Type. Ver também AmbientPropertyValue.

IXamlSchemaContextProvider

Documentação de referência: IXamlSchemaContextProvider

Definido por:System.Xaml namespace, assembly System.Xaml

Relevante para: caminho de carregamento e qualquer operação que deva resolver um tipo XAML para um tipo de suporte.

API de serviço :SchemaContext

O contexto de esquema XAML é necessário para qualquer operação de carregamento adiado, porque o mesmo contexto de esquema deve agir na área adiada para integrar o conteúdo adiado. Para obter mais informações sobre a função do contexto de esquema XAML, consulte Serviços XAML.

IRootObjectProvider

Documentação de referência: IRootObjectProvider

Definido por:System.Xaml namespace, assembly System.Xaml

Relevante para: Caminho de carga.

API de serviço :RootObject

O serviço é relevante para serviços de aplicativo que são expostos por uma estrutura específica ou por recursos de uma classe de elemento raiz usada com freqüência em uma estrutura. Um cenário para obter o objeto raiz é conectar code-behind e fiação de eventos. Por exemplo, a implementação WPF do x:Class é usada para compilação de marcação e fiação de qualquer atributo do manipulador de eventos encontrado em qualquer outra posição na marcação XAML. O ponto de conexão de classes parciais definidas por marcação e code-behind para compilação de marcação está no elemento raiz.

IXamlNamespaceResolver

Documentação de referência: IXamlNamespaceResolver

Definido por:System.Xaml namespace, assembly System.Xaml

Relevante para: Caminho de carga, caminho de salvamento.

Service API:GetNamespace para caminho de carga GetNamespacePrefixes para caminho de salvamento.

IXamlNamespaceResolver é um serviço que pode retornar um identificador de namespace XAML / URI com base em seu prefixo conforme mapeado na marcação XAML de origem.

IProvideValueTarget

Documentação de referência: IProvideValueTarget

Definido por:System.Windows.Markup namespace, assembly System.Xaml

Relevante para: Carregar caminho e salvar caminho.

APIs de serviço:TargetObject, TargetProperty.

IProvideValueTarget permite que um conversor de tipo ou extensão de marcação obtenha contexto sobre onde ele está agindo no tempo de carregamento. As implementações podem usar esse contexto para invalidar um uso. Por exemplo, o WPF tem lógica dentro de algumas de suas extensões de marcação, como DynamicResourceExtension. A lógica verifica o TargetProperty para certificar-se de que a extensão é usada apenas para definir propriedades de dependência (ou uma pequena lista de outras propriedades não dependentes).

IXamlNameResolver

Documentação de referência: IXamlNameResolver

Definido por:System.Xaml namespace, assembly System.Xaml

Relevante para: Definição de gráfico de objeto de caminho de carga, resolvendo objetos identificados por x:Name, x:Referenceou técnicas específicas da estrutura.

APIs de serviço:Resolve; outras APIs para cenários mais avançados, como lidar com referências de encaminhamento.

A implementação dos Serviços XAML .NET de manipulação de x:Reference depende desse serviço. Estruturas ou ferramentas específicas que suportam a estrutura usam esse serviço para manipulação de propriedades x:Name ou equivalentes (RuntimeNamePropertyAttribute atribuídas).

IDestinationTypeProvider

Documentação de referência: IDestinationTypeProvider

Definido por:System.Xaml namespace, assembly System.Xaml

Relevante para: Resolução do caminho de carga de informações indiretas do tipo CLR.

API de serviço :GetDestinationType

Para obter mais informações, consulte IDestinationTypeProvider.

Ver também