Este artigo foi traduzido por máquina. Para visualizar o arquivo em inglês, marque a caixa de seleção Inglês. Você também pode exibir o texto Em inglês em uma janela pop-up, movendo o ponteiro do mouse sobre o texto.
Tradução
Inglês

Visão geral de conversores de tipo para XAML

.NET Framework (current version)
 

Tipo conversores fonte lógica para um gravador de objeto que converte de uma cadeia de caracteres na marcação XAML em objetos específicos em um gráfico de objeto. Em serviços de XAML do .NET Framework, o conversor de tipo deve ser uma classe que deriva de TypeConverter. Alguns conversores também suportam o XAML caminho para salvar e podem ser usados para serializar um objeto em um formulário de cadeia de caracteres na marcação de serialização. Este tópico descreve como e quando conversores de tipo em XAML são invocados e fornece instruções de implementação para o método substituições de TypeConverter.

As seções a seguir explicam os conceitos básicos sobre como o XAML usa cadeias de caracteres e como gravadores de objeto nos serviços de XAML do .NET Framework usam conversores de tipo para processar alguns dos valores de cadeia de caracteres que são encontrados em uma fonte de XAML.

Quando você define um valor de atributo em um arquivo XAML, o tipo inicial desse valor é uma cadeia de caracteres em um sentido geral e um valor de atributo de cadeia de caracteres em um sentido XML. Até mesmo outros primitivos como Double inicialmente são cadeias de caracteres para um processador XAML.

Na maioria dos casos, um processador XAML precisa de duas partes de informações para processar um valor de atributo. A primeira parte das informações é o tipo de valor da propriedade que está sendo definido. Qualquer cadeia de caracteres que define um valor de atributo e que é processado em XAML, por fim, deve ser convertida ou resolvida para um valor desse tipo. Se o valor é um primitivo é compreendido pelo analisador XAML (como um valor numérico), será tentada uma conversão direta da cadeia de caracteres. Se o valor para o atributo referencia uma enumeração, a cadeia de caracteres fornecida é verificada para uma correspondência de nome a uma constante nomeada na enumeração. Se o valor não é um primitivo compreendido pelo analisador nem um nome de uma enumeração, o tipo aplicável deve ser capaz de fornecer um valor ou referência se baseia em uma cadeia de caracteres convertida.

System_CAPS_noteObservação

Diretivas de linguagem XAML não usar conversores de tipo.

Usos de extensão de marcação devem ser tratados por um processador XAML antes de verificar o tipo de propriedade e outras considerações. Por exemplo, se uma propriedade sendo definida como um atributo normalmente tem uma conversão de tipo, mas em um caso específico é definida por um uso de extensão de marcação, então o comportamento de extensão de marcação processa primeiro. É uma situação comum em uma extensão de marcação é necessária fazer uma referência a um objeto que já existe. Para esse cenário, um conversor de tipo sem monitoração de estado só pode gerar uma nova instância, que pode não ser desejável. Para obter mais informações sobre extensões de marcação, consulte Visão geral das extensões de marcação para XAML.

Nas implementações de serviços do WPF e XAML do .NET, há determinados tipos CLR que têm o tratamento de conversão de tipo nativo, no entanto, mangueira tipos CLR não é convencionalmente pensada como primitivos. Um exemplo de um tipo é DateTime. Uma razão para isso é como funciona a arquitetura do .NET Framework: o tipo DateTime é definida em mscorlib, a biblioteca mais básica no .NET. DateTime não tem permissão para ser atribuído com um atributo de outro assembly que apresenta uma dependência (TypeConverterAttribute é do sistema); portanto, o mecanismo de descoberta de conversor de tipo comum por atribuição não têm suporte. Em vez disso, o analisador XAML tem uma lista de tipos que precisam de processamento nativa e processa esses tipos semelhantes a como os primitivos true são processados. No caso de DateTime, esse processamento envolve uma chamada para Parse.

As seções a seguir discutem a API da TypeConverter classe.

Em serviços de XAML do .NET Framework, todos os conversores de tipo são usados para fins XAML são classes que derivam da classe base TypeConverter. O TypeConverter classe existia em versões do .NET Framework antes da existência desse XAML; um original TypeConverter cenários era fornecer conversão de cadeia de caracteres para editores de propriedade em designers visuais.

Para XAML, a função de TypeConverter é expandido. Para fins XAML, TypeConverter é a classe base para fornecer suporte para a cadeia de caracteres e conversões de cadeia de certos. De cadeia de caracteres habilita a análise de um valor de atributo de cadeia de caracteres XAML. A cadeia de caracteres pode permitir que um valor de tempo de execução de uma propriedade de objeto específico de processamento volta para um atributo em XAML para serialização.

TypeConverter define quatro membros que são relevantes para a conversão de cadeia de caracteres e de cadeia de caracteres para fins de processamento XAML:

Esses membros, o método mais importante é ConvertFrom, que converte a cadeia de caracteres de entrada para o tipo de objeto necessário. O ConvertFrom método pode ser implementado para converter uma grande variedade de tipos para o tipo de destino pretendido do conversor. Portanto, pode servir fins que ultrapassam o XAML, como oferecer suporte a conversões de tempo de execução. No entanto, para uso em XAML, apenas o caminho do código que pode processar um String entrada é importante.

O método segundo o mais importante é ConvertTo. Se um aplicativo é convertido em uma representação de marcação (por exemplo, se ele for salvo em XAML como um arquivo), ConvertTo está envolvido no cenário maior de um XAML texto gravadores produzem uma representação de marcação. Nesse caso, o caminho de código importantes para XAML é quando o chamador passa uma destinationType de String.

CanConvertTo e CanConvertFrom são métodos de suporte que são usados quando os recursos de consultas de um serviço de TypeConverter implementação. Você deve implementar esses métodos para retornar true para os casos de tipo específico que os métodos de conversão equivalente do conversor de seu suportam. Para fins XAML, isso geralmente significa o String tipo.

Cada TypeConverter implementação exclusivamente pode interpretar o que é uma cadeia de caracteres válida para uma conversão, e também pode usar ou ignorar a descrição do tipo que é passada como parâmetros. Uma consideração importante para a conversão de tipo de cultura e XAML é o seguinte: Embora usar cadeias de caracteres localizáveis como valores de atributo tem suporte em XAML, é possível usar essas cadeias de caracteres localizáveis como entrada de conversor de tipo com requisitos específicos de cultura. Essa limitação existe porque conversores de tipo para valores de atributo XAML envolvem um comportamento de processamento de XAML de linguagem necessariamente fixo que usa en-US cultura. Para obter mais informações sobre os motivos de design para essa restrição, consulte a especificação da linguagem XAML ([MS-XAML]) ou Visão geral de localização e globalização do WPF.

Como um exemplo onde a cultura pode ser um problema, algumas culturas usam uma vírgula, em vez de um período como o delimitador de ponto decimal para números na forma de cadeia de caracteres. Esse uso entra em conflito com o comportamento que têm vários conversores de tipo existentes, que é usar uma vírgula como delimitador. Passando uma cultura por meio de xml:lang no XAML ao redor não resolver o problema.

Para ser usado como um TypeConverter implementação que oferece suporte ao XAML, o ConvertFrom método para esse conversor deve aceitar uma cadeia de caracteres como o value parâmetro. Se a cadeia de caracteres está em um formato válido e pode ser convertida pelo TypeConverter implementação, o objeto retornado deve oferecer suporte a uma conversão para o tipo esperado pela propriedade. Caso contrário, o ConvertFrom implementação deve retornar null.

Cada TypeConverter implementação exclusivamente pode interpretar o que constitui uma cadeia de caracteres válida para uma conversão, e também pode usar ou ignorar os contextos de tipo descrição ou cultura que são passados como parâmetros. No entanto, o processamento do WPF XAML não pode passar valores para o contexto de descrição de tipo em todos os casos e também podem não passar a cultura com base em xml:lang.

System_CAPS_noteObservação

Não use as chaves ({}), especificamente a chave de abertura ({), como um elemento de seu formato de cadeia de caracteres. Esses caracteres são reservados como a entrada e saída para uma sequência de extensão de marcação.

É aconselhável lançar uma exceção quando o conversor de tipo deve ter acesso a um serviço XAML do gravador de objeto de serviços XAML do .NET Framework, mas o GetService chamada é feita em relação ao contexto não retorna esse serviço.

ConvertTo potencialmente é usado para suporte de serialização. Suporte de serialização por meio de ConvertTo para seu tipo personalizado e o tipo de conversor não é um requisito absoluto. No entanto, se estiver implementando um controle, ou usando a serialização de como parte dos recursos ou design de sua classe, você deve implementar ConvertTo.

Para ser usado como um TypeConverter implementação que oferece suporte ao XAML, o ConvertTo método para esse conversor deve aceitar uma instância do tipo (ou um valor) que tem suporte como o value parâmetro. Quando o destinationType parâmetro é do tipo String, o objeto retornado deve ser capaz de ser convertida como String. Cadeia de caracteres retornada deve representar um valor serializado de value. Idealmente, o formato de serialização que você escolher deve ser capaz de gerar o mesmo valor como se essa cadeia de caracteres foram passada para o ConvertFrom implementação do conversor mesmo, sem perda de informações.

Se o valor não pode ser serializado ou o conversor não oferece suporte à serialização, o ConvertTo implementação deve retornar null e pode gerar uma exceção. No entanto, se você lançar exceções, você deve relatar a incapacidade de usar a conversão como parte de seu CanConvertTo implementação para que a prática recomendada de verificação com CanConvertTo primeiro evitar exceções é suportado.

Se o destinationType parâmetro não é do tipo String, você pode escolher seu próprio tratamento de conversor. Normalmente, você reverter para a implementação base tratamento que na base de ConvertTo gera uma exceção específica.

É aconselhável lançar uma exceção quando o conversor de tipo deve ter acesso a um serviço XAML do gravador de objeto de serviços XAML do .NET Framework, mas o GetService chamada é feita em relação ao contexto não retorna esse serviço.

O CanConvertFrom implementação deve retornar true para sourceType do tipo String e, caso contrário, adiar a implementação base. Não lançam exceções CanConvertFrom.

O CanConvertTo implementação deve retornar true para destinationType do tipo String, e caso contrário, adiar a implementação base. Não lançam exceções CanConvertTo.

Para o conversor de tipo personalizado a ser usado como atuando conversor de tipo para uma classe personalizada por serviços XAML do .NET Framework, você deve aplicar o Atributo do .NET Framework TypeConverterAttribute a sua definição de classe.  O ConverterTypeName que você especificar por meio do atributo deve ser o nome do tipo de seu conversor de tipo personalizado. Se você aplicar esse atributo, quando o processador XAML manipula valores onde o tipo de propriedade usa o tipo de classe personalizada, ele pode cadeias de caracteres de entrada e retornar as instâncias de objeto.

Você também pode fornecer um conversor de tipo em uma base por propriedade. Em vez de aplicar um Atributo do .NET Framework TypeConverterAttribute à definição de classe, aplicá-la a uma definição de propriedade (definição do principal, não o get/set implementações dentro dele).  O tipo da propriedade deve corresponder ao tipo que é processado pelo seu conversor de tipo personalizado. Com esse atributo aplicado, quando um processador XAML lida com valores de propriedade, ele pode processar cadeias de caracteres de entrada e retornar as instâncias de objeto. A técnica de conversor de tipo por propriedade é particularmente útil se você optar por usar um tipo de propriedade de Microsoft .NET Framework ou de alguma outra biblioteca onde você não pode controlar a definição de classe e não é possível aplicar um TypeConverterAttribute não existe.

Para fornecer um comportamento de conversão de tipo de membro personalizado anexado, aplicar TypeConverterAttribute para o Get método de acessador do padrão de implementação para o membro anexado.

Os serviços disponíveis são as mesmas para qualquer conversor de valor. A diferença está em como cada conversor de valor recebe o contexto do serviço. Acesso a serviços e os serviços disponíveis estão documentados no tópico Conversores de tipo e extensões de marcação para XAML.

Se você estiver trabalhando com um fluxo de nó XAML, a ação ou o resultado final de um conversor de tipo não será executado ainda. Um caminho de carga, a cadeia de caracteres do atributo que eventualmente precisa ter o tipo convertido para a carga permanece como um valor de texto dentro de um membro de início e término. O conversor de tipos que, por fim, é necessário para essa operação pode ser determinada por meio de XamlMember.TypeConverter propriedade. No entanto, como obter um valor válido de XamlMember.TypeConverter depende de ter um contexto de esquema XAML, que pode acessar essas informações por meio do membro base ou o tipo do valor do objeto que usa o membro. Invocar o comportamento de conversão de tipo também requer o contexto do esquema XAML como que requer o mapeamento de tipo e criando uma instância do conversor.

Mostrar: