Partilhar via


Conversores de tipo e extensões de marcação para XAML

Conversores de tipo e extensões de marcação são duas técnicas que os sistemas de tipo XAML e os gravadores XAML usam para gerar componentes de gráfico de objetos. Embora compartilhem algumas características, conversores de tipo e extensões de marcação são representados de forma diferente em um fluxo de nó XAML. Neste conjunto de documentação, conversores de tipo, extensões de marcação e construções semelhantes às vezes são coletivamente referidos como conversores de valor.

Conversores de valor

Em XAML, conversores de valor são usados para vários cenários. A lista a seguir mostra os diferentes tipos de conversores de valor em XAML:

  • Conversor de tipo

  • Extensão de marcação

  • Serializador de valor

  • Classe relacionada ou classe de suporte que fornece a lógica para uma sintaxe de texto XAML

Conversores de tipo

Na definição de Serviços XAML .NET, conversores de tipo são classes que derivam da classe TypeConverter CLR. TypeConverter é uma classe que estava no .NET antes do XAML existir. Seu objetivo original era oferecer suporte a janelas de propriedade e metáforas de edição baseadas em texto semelhantes para propriedades do IDE. A introdução do XAML ao .NET usa TypeConverter para converter uma sintaxe de texto (como encontrada em um valor de atributo ou em um nó de valor XAML) em um objeto. TypeConverter também pode ser usado para serializar um valor de objeto para sintaxe de texto. TypeConverter também foi usado em implementações XAML específicas da estrutura anteriores no Windows Presentation Foundation (WPF) e no Windows Communication Foundation (WCF). Para obter mais informações sobre o TypeConverter em XAML, consulte Visão geral dos conversores de tipo para XAML.

Extensões de marcação

Na implementação dos Serviços XAML do .NET, as extensões de marcação são classes que derivam da classe MarkupExtension. As extensões de marcação são um conceito que, neste formulário, é originado pela linguagem XAML. Você pode pensar em uma extensão de marcação como sendo algo como uma sequência de escape extensível que chama uma classe de serviço para fornecer sua lógica. Em termos de marcação, os processadores XAML reconhecem universalmente uma extensão de marcação por uma sequência de texto que começa com uma chave de abertura ({) em uma cadeia de texto.

As extensões de marcação diferem dos conversores de tipo. Os conversores de tipo são normalmente associados a tipos ou membros. Eles são invocados quando uma criação de gráfico de objeto ou uma serialização encontra sintaxe de texto associada a essas entidades.

As extensões de marcação estão associadas a uma única classe de serviço de suporte, mas podem ser aplicadas a qualquer valor de membro. (No entanto, você pode implementar sua extensão de marcação para restringir deliberadamente seu uso a determinados membros ou tipos de destino, usando o contexto de serviço.) As extensões de marcação podem substituir uma associação de conversor de tipo. Ou você pode usá-los para especificar um valor de atributo para membros que, de outra forma, não suportariam uma sintaxe de texto.

Para obter mais informações sobre o padrão de implementação de extensão de marcação para XAML, consulte Markup Extensions for XAML Overview.

Serializadores de valor

Um ValueSerializer é um conversor de tipo especializado que é otimizado para converter um objeto em uma cadeia de caracteres. Um ValueSerializer para XAML pode não implementar o método ConvertFrom. Uma implementação ValueSerializer obtém serviços de uma maneira que é como uma implementação TypeConverter. Os métodos virtuais fornecem uma entrada context parâmetro. O parâmetro context é do tipo IValueSerializerContext, que herda da interface IServiceProvider e tem um método GetService.

No sistema de tipo XAML e para implementações de gravador XAML que usam processamento de loop de nó XAML para serialização, um conversor de valor associado a um tipo ou membro é relatado por sua própria propriedade XamlType.ValueSerializer. O significado para os gravadores XAML que executam a serialização é que, se existir um XamlType.TypeConverter e XamlType.ValueSerializer, o conversor de tipo deve ser usado para o caminho de carga e o serializador de valor deve ser usado para o caminho de salvamento. Se XamlType.TypeConverter existir, mas XamlType.ValueSerializer estiver null, o conversor de tipo também será usado para o caminho de salvamento.

Outros conversores de valor

Um conversor de valor é extensível além dos padrões específicos de um conversor de tipo ou uma extensão de marcação. No entanto, essa personalização também exigiria a redefinição do sistema de tipo XAML, conforme fornecido pelos Serviços XAML do .NET. O sistema de tipos XAML existente tem representações e sistemas de relatórios para conversores de tipo, extensões de marcação e serializadores de valor, mas não para formas personalizadas de conversão de valor. Se você quiser criar conversores de valor personalizados, use o tipo XamlValueConverter<TConverterBase>.

Conversores de tipo e extensões de marcação em combinação

Extensões de marcação e conversores de tipo são usados para diferentes situações em XAML. Embora o contexto esteja disponível para usos de extensão de marcação, o comportamento de conversão de tipo de propriedades em que uma extensão de marcação fornece um valor geralmente não é verificado nas implementações de extensão de marcação. Em outras palavras, mesmo que uma extensão de marcação retorne uma cadeia de caracteres de texto como sua saída ProvideValue, o comportamento de conversão de tipo nessa cadeia de caracteres aplicado a uma propriedade específica ou a um tipo de valor de propriedade específica não é invocado. Geralmente, o objetivo de uma extensão de marcação é processar uma cadeia de caracteres e retornar um objeto sem qualquer conversor de tipo envolvido.

Contexto de serviço para um conversor de valor

Quando você implementa um conversor de valor, geralmente precisa de acesso a um contexto no qual o conversor de valor é aplicado. Este contexto é conhecido como contexto de serviço. O contexto de serviço 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 objetos XAML fornecem, e assim por diante. Para obter mais informações sobre os contextos de serviço disponíveis para um conversor de valor e como acessar os serviços que um contexto de serviço pode fornecer, consulte Contextos de serviço disponíveis para conversores de tipo e extensões de marcação.

Ver também