Contextos de serviço disponíveis para conversores de tipo e extensões de marcação
Os autores dos tipos que dão suporte a 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 de gráfico de objeto circundante. 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 grafo 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 que está disponível e passado por tipos XamlObjectWriter ou 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 implementador de um conversor de valor, você geralmente precisa acessar 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 tipo 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 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 dão 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 IServiceProvider, e, portanto, há um GetService método 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 de 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, você usa 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 GetService 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 somente por meio 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 do .NET do caminho de carregamento ou do 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 ou MarkupExtensionContext
TextSyntaxContext
, mas as especificidades de ambas as classes são internas. Sua interação com essas classes é limitada a solicitar serviços delas, por meio 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 diretrizes 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. 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 da implementação explícita indica aos chamadores que a ITypeDescriptorContext API não é relevante para sistemas de 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 e também depende de implementações explícitas para suprimir falsas implicações sobre o sistema de ITypeDescriptorContext tipos 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 carga e interação com o contexto de esquema XAML
API de serviço: Resolve
Pode influenciar o mapeamento de tipo XAML para CLR necessário quando o gravador XAML constrói um objeto CLR em um grafo 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 arquivo 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 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 do 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 é passada para o gravador de objetos XAML e relatada por esse serviço.
IAmbientProvider
Documentação de referência: IAmbientProvider
Definido por: System.Xaml namespace, assembly System.Xaml
Relevante para: Carregar o tratamento de caminho 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 ambiente 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 adiante no fluxo de nó XAML e que são descendentes no grafo de objeto podem acessar a propriedade de ambiente ou a instância de tipo no tempo de carregamento; ou eles podem usar o conhecimento da estrutura do ambiente em tempo de economia. Isso pode afetar o grau de qualificação necessário para resolver tipos de outros serviços, como for IXamlTypeResolver ou for x:Type
. Consulte também AmbientPropertyValue.
IXamlSchemaContextProvider
Documentação de referência: IXamlSchemaContextProvider
Definido por: System.Xaml namespace, assembly System.Xaml
Relevante para: Caminho de carga 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 adiamento de carregamento, pois o mesmo contexto de esquema deve atuar 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 aplicativos 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 of x:Class
é usada para compilação de marcação e conexão de qualquer atributo de manipulador de eventos encontrado em qualquer outra posição na marcação XAML. O ponto de conexão de marcação e classes parciais definidas 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 garantir que a extensão seja 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 grafo de objeto de caminho de carga, resolução de objetos identificados por x:Name
, x:Reference
, ou 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 tratamento 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 de caminho de carga de informações de tipo CLR indireto.
API de serviço: GetDestinationType
Para obter mais informações, consulte IDestinationTypeProvider.
Confira também
.NET Desktop feedback