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

Os autores dos tipos que oferecem suporte a conversor de tipos e usos de 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 objeto ao redor. As informações podem ser necessárias para que o objeto fornecido seja instanciado corretamente ou para que referências de objeto a objetos existentes no gráfico de objeto 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. O código de suporte do conversor de tipo ou da extensão de marcação pode consultar um serviço usando um contexto de provedor de serviços disponível e transmitido de XamlObjectWriter ou tipos relacionados. O contexto do esquema XAML está disponível diretamente por meio de um desses serviços. Este tópico descreve como acessar contextos de serviço 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 um implementador de um conversor de valor, você geralmente precisa de acesso a algum tipo de contexto no qual o conversor de valor é aplicado. Esse contexto pode incluir informações como o contexto do esquema XAML ativo, o acesso ao sistema de mapeamento de tipos que o contexto do esquema XAML e o gravador de objetos 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 por meio dos parâmetros de contexto que fazem parte da assinatura de cada método virtual. Em todos os casos, você implementou IServiceProvider no contexto e pode ligar 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 de entrada serviceProvider é 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 tipos

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

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 serializador de valor

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

Usando os contextos do provedor de serviços XAML

O provedor de serviços para acesso 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 por meio da interface e como ela é passada para GetService o contexto relevante. Sempre que uma operação de processamento XAML nas implementações padrão dos Serviços XAML do .NET de caminho de carregamento ou caminho de salvamento invoca a extensão de marcação relevante ou os métodos de conversor 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 um MarkupExtensionContext ou TextSyntaxContext, mas as especificidades de ambas as classes são internas. Sua interação com essas classes se limita a solicitar serviços delas, através GetServicedo .

Serviços disponíveis no contexto do 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.GetServiceo .

ITypeDescriptorContext

Documentação de referência: ITypeDescriptorContext

Deriva de IServiceProvider. Essa classe representa o contexto nas assinaturas padrão TypeConverter ; TypeConverter é uma classe que existe desde o .NET Framework 1.0. Ele é anterior ao XAML e ao cenário XAML TypeConverter para conversão de tipo de valor de cadeia de caracteres. No contexto dos Serviços XAML do .NET, os métodos de TypeConverter são implementados explicitamente. O comportamento explícito da implementação indica aos chamadores que a ITypeDescriptorContext API 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 do .NET.

IValueSerializerContext

Documentação de referência: IValueSerializerContext

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

IXamlTypeResolver

Documentação de referência: IXamlTypeResolver

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

Relevante para: Cenários de caminho de carregamento e interação com o contexto do 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 geralmente 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.

IUriContexto

Documentação de referência: IUriContext

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

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

API de serviço:BaseUri

Esse serviço relata uma raiz de URI disponível globalmente, se houver. A raiz de URI pode ser usada para resolver URIs relativos a URIs absolutos ou vice-versa. Esse cenário é relevante principalmente para serviços de aplicativos que são expostos por uma estrutura específica ou recursos de uma classe de elemento raiz usada com frequê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: Tratamento de caminho de carga e adiamentos ou otimizações de pesquisa de tipo.

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

O conceito de ambiência 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 de ambiente. Extensões de marcação ou conversores de tipo que estão mais ao longo do fluxo de nó XAML e que são descendentes no gráfico de objeto podem acessar a propriedade ambient ou a instância de tipo no momento do carregamento; ou podem usar o conhecimento da estrutura do ambiente para economizar tempo. Isso pode afetar o grau de qualificação necessário para resolver tipos de outros serviços, como para ou para IXamlTypeResolverx:Type. Consulte 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 do esquema XAML é necessário para quaisquer operações de adiamento de carregamento, 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 do 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 carregamento.

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 frequência em uma estrutura. Um cenário para obter o objeto raiz é conectar code-behind e conexão de eventos. Por exemplo, a implementação do WPF de é usada para compilação de marcação e conexão de qualquer atributo de manipulador de x:Class 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: Carregar caminho, salvar caminho.

API de serviço:GetNamespace para caminho de carregamento, GetNamespacePrefixes para caminho de salvamento.

IXamlNamespaceResolver é um serviço que pode retornar um identificador/URI de namespace XAML 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 momento do 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 de não-dependência).

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 carregamento, resolução de 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 diretas.

A implementação de manipulação dos Serviços XAML do x:Reference .NET depende desse serviço. Estruturas ou ferramentas específicas que dão suporte à estrutura usam esse serviço para x:Name manipulação ou manipulação de propriedade equivalente (RuntimeNamePropertyAttribute atribuída).

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.

Confira também