TypeConverters and XAML
Este tópico apresenta a finalidade da conversão de tipo de seqüência de caracteres como um recurso de linguagem XAML geral. No.NET Framework, o TypeConverter classe serve a um propósito específico, como parte da implementação de uma classe personalizada gerenciada, que pode ser usada como um valor de propriedade no uso do atributo XAML. Se você escrever uma classe personalizada e desejar instâncias da classe para ser usada como valores de atributo definível de XAML, talvez você precise aplicar um TypeConverterAttribute para sua classe, escrever um personalizado TypeConverter classe, ou ambos.
Este tópico contém as seguintes seções.
- Conceitos de conversão de tipo
- Implementing a Type Converter
- Applying the TypeConverterAttribute
- Tópicos relacionados
Conceitos de conversão de tipo
XAML and String Values
Quando você define um valor de atributo em um arquivo XAML, o tipo inicial desse valor é uma seqüência de caracteres em texto puro. Até mesmo outros primitivos como Double são inicialmente as seqüências de texto para um processador XAML.
Um processador XAML precisa de duas partes de informação para processar um valor de atributo. The first piece of information is the value type of the property that is being set. Qualquer seqüência de caracteres que define um valor de atributo e o que é processado em XAML, por fim, deve ser convertida ou resolvida para um valor desse tipo. Se o valor for um primitivo que seja compreendido pelo analisador XAML (como, por exemplo, um valor numérico), uma conversão direta da seqüência de caracteres é tentada. Se o valor é uma enumeração, a seqüência é usada para verificar se há uma correspondência de nome de uma constante nomeada no fato da enumeração. Se o valor for nem um primitivo compreendido o analisador nem uma enumeração, em seguida, o tipo em questão deve ser capaz de fornecer uma instância do tipo ou um valor, com base em uma seqüência de caracteres convertida. Para fazer isso, indicando uma classe do conversor de tipo. O conversor de tipo é efetivamente uma classe auxiliar para fornecer valores de outra classe, para o cenário XAML e também potencialmente para chamadas de código no.NET do.
Usando o comportamento de conversão de tipo existente no XAML
Dependendo de sua familiaridade com os conceitos subjacentes do XAML, você pode já estar usando o comportamento de conversão do tipo em XAML do aplicativo básico sem perceber. Por exemplo, o WPF define literalmente centenas de propriedades que levam um valor do tipo Point. A Point é um valor que descreve uma coordenada em um espaço de coordenadas bidimensional e tem realmente apenas duas propriedades importantes: X and Y. Quando você especifica um ponto em XAML, você especificá-lo como uma seqüência de caracteres com um delimitador (geralmente uma vírgula) entre a X e Y valores que você fornecer. For example: <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">.
Até mesmo este tipo simples de Point e seu uso simple em XAML envolvem um conversor de tipo. Nesse caso é que a classe PointConverter.
O conversor de tipo de Point definido com o otimiza de nível de classe os usos da marcação de todas as propriedades que levam Point. Sem um conversor de tipo aqui, seria necessário o seguinte marcação muito mais detalhada para o mesmo exemplo mostrado anteriormente:
<LinearGradientBrush>
<LinearGradientBrush.StartPoint>
<Point X="0" Y="0"/>
</LinearGradientBrush.StartPoint>
<LinearGradientBrush.EndPoint>
<Point X="1" Y="1"/>
</LinearGradientBrush.EndPoint>
<LinearGradientBrush>
Se deseja usar a seqüência de caracteres de conversão de tipo ou uma sintaxe equivalente mais detalhada geralmente é uma opção de estilo de codificação. O fluxo de trabalho XAML ferramentas também pode influenciar a como os valores são definidos. Algumas ferramentas XAML tendem a emitir a forma mais detalhada de marcação que é mais fácil para viagem para modos de exibição designer ou o seu próprio mecanismo de serialização.
Conversores de tipo existente podem geralmente ser descobertos no WPF e.NET Framework tipos Verificando uma classe (ou propriedade), a presença de um aplicado TypeConverterAttribute. Esse atributo será o nome da classe que é o conversor de tipo de suporte para os valores desse tipo, para fins XAML, bem como potencialmente outras finalidades.
Conversores de tipo e as extensões de marcação
Conversores de tipo e extensões de marcação preenchem funções ortogonais em termos de comportamento do processador XAML e os cenários que são aplicadas. Embora o contexto está disponível para usos da extensão de marcação, comportamento de conversão de tipo de propriedades onde uma extensão de marcação fornece que um valor é geralmente não é verificado as implementações de extensão de marcação. Em outras palavras, mesmo se a extensão de marcação retorna uma seqüência de texto como seu ProvideValue de saída, o comportamento de conversão de tipo nessa cadeia de caracteres como aplicado a uma propriedade específica ou um tipo de valor da propriedade não é chamado, geralmente, a finalidade de uma extensão de marcação é uma seqüência de caracteres de processo e retornar um objeto sem qualquer conversor de tipo envolvidos.
Uma situação comum onde uma extensão de marcação é necessária em vez de um conversor de tipo é fazer uma referência a um objeto que já existe. Na melhor das hipóteses, um conversor de tipo sem monitoração de estado só pode gerar uma nova instância não pode ser desejável. For more information on markup extensions, see As extensões de marcação e o WPF XAML.
Conversores de tipo nativo
No WPF e.NET a implementação da estrutura do analisador XAML, há certos tipos que têm o tratamento de conversão de tipo nativo, ainda que não são tipos convencionalmente podem ser considerados como primitivos. Um exemplo desse tipo é DateTime. O motivo para isso se baseia em como o.Arquitetura do NET Framework funciona: o tipo de DateTime é definido em mscorlib, a biblioteca mais básica no.NET. DateTimenão é permitido para ser atribuído com um atributo que é proveniente de outro conjunto que apresenta uma dependência (TypeConverterAttribute é do sistema) para que o mecanismo de descoberta de conversor tipo usual por atribuição não é suportado. Em vez disso, o analisador XAML tem uma lista de tipos que precisam de tal processamento nativo e processa esses da mesma forma como os primitivos true são processados. (No caso de DateTime isso envolve uma chamada para Parse.
Implementing a Type Converter
TypeConverter
No Point exemplo fornecido anteriormente, a classe PointConverter foi mencionado. Para.NET implementações de XAML, todos os conversores de tipo são usados para fins XAML são classes que derivam da classe base TypeConverter. O TypeConverter classe existia nas versões do.NET Framework que precedem a existência de XAML; um dos seus usos originais era fornecer conversão de seqüência de caixas de diálogo de propriedade em designers visuais. Para XAML, a função de TypeConverter é expandido para incluir sendo a classe base para a seqüência de caracteres e de seqüência de conversões que permitem analisar o valor do atributo de seqüência de caracteres e possivelmente processando um valor de tempo de execução de uma propriedade de determinado objeto volta para uma seqüência de caracteres para serialização como um atributo.
TypeConverterDefine os quatro membros que são relevantes para a conversão em cadeias de caracteres para fins de processamento de XAML:
Of these, the most important method is ConvertFrom. This method converts the input string to the required object type. Estritamente falando, o ConvertFrom método poderia ser implementado para converter uma maior variedade de tipos para o tipo de destino pretendido do conversor e, portanto, servem a finalidades que ultrapassam o XAML, como suporte a conversões de tempo de execução, mas para fins de XAML é o caminho de código que pode processar um String entrada assuntos.
The next most important method is ConvertTo. Se um aplicativo é convertido em uma representação de marcação (por exemplo, se ele é salvo XAML como um arquivo), ConvertTo é responsável por produzir uma representação de marcação. Nesse caso, o caminho de código é importante para o XAML é quando você passar um destinationType de String .
CanConvertTo and CanConvertFrom are support methods that are used when a service queries the capabilities of the TypeConverter implementation. Você deve implementar esses métodos para retornar true para o tipo específico de ocorrências que os métodos de conversão equivalente do seu suporte de conversor. Para fins XAML, isso geralmente significa que o String tipo.
Informações de cultura e conversores de tipo para XAML
Cada TypeConverter implementação pode ter sua própria interpretação do que constitui uma seqüência válida para uma conversão e pode também usar ou ignorar a descrição do tipo passada como parâmetros. Há uma consideração importante em relação à cultura e conversão de tipo XAML. Usar seqüências de caracteres localizáveis como valores de atributo inteiramente é suportado pelo XAML. Mas usando essa cadeia de caracteres localizável, como não há suporte para a entrada do conversor de tipo com os requisitos específicos de cultura, porque os conversores de tipo para os valores de atributo XAML envolvem um comportamento de análise de linguagem necessariamente fixo, usando en-US cultura. Para obter mais informações sobre as razões de design para essa restrição, você deve consultar a especificação da linguagem XAML ([MS-xaml]).
Como um exemplo onde a cultura pode ser um problema, algumas culturas utilize uma vírgula como delimitador de ponto decimal para números. Isso vai de encontro com o comportamento que muitos dos conversores de tipo de WPF XAML, que é usar uma vírgula como um delimitador (baseado em precedentes históricos, como o x comum, o formulário de y ou vírgula delimitado listas). Mesmo passando uma cultura no XAML ao redor (configuração de Language ou xml:lang para o sl-SI de cultura, um exemplo de uma cultura que usa uma vírgula decimal, dessa forma) não resolve o problema.
Implementing ConvertFrom
Para ser usada como um TypeConverter implementação que oferece suporte a XAML, o ConvertFrom método para que o conversor deve aceitar uma seqüência de caracteres como o value parâmetro. Se a seqüência estava válido Formatar e pode ser convertida por meio de TypeConverter implementação, e em seguida, o objeto retornado deve oferecer suporte a projeção para o tipo esperado pela propriedade. Otherwise, the ConvertFrom implementation must return null.
Each TypeConverter implementation can have its own interpretation of what constitutes a valid string for a conversion, and can also use or ignore the type description or culture contexts passed as parameters. No entanto, o processamento do WPF XAML podem não passar valores para o contexto de descrição do tipo em todos os casos e também podem não passar cultura com base no xml:lang.
Observação
Do not use the curly brace characters, particularly {, as a possible element of your string format.These characters are reserved as the entry and exit for a markup extension sequence.
Implementing ConvertTo
ConvertTopotencialmente é usado para suporte de serialização. Suporte de serialização por meio de ConvertTo para seu tipo personalizado e seu tipo de conversor é não um absoluto requisito. However, if you are implementing a control, or using serialization of as part of the features or design of your class, you should implement ConvertTo.
Para ser usada como um TypeConverter implementação que oferece suporte a XAML, o ConvertTo método para que o conversor deve aceitar uma instância do tipo (ou um valor) sendo suportado como o value parâmetro. Quando o destinationType parâmetro é o tipo String, o objeto retornado deve ser capaz de ser convertido como String. The returned string must represent a serialized value of value. Ideally, the serialization format you choose should be capable of generating the same value if that string were passed to the ConvertFrom implementation of the same converter, without significant loss of information.
If the value cannot be serialized, or the converter does not support serialization, the ConvertTo implementation must return null, and is permitted to throw an exception in this case. Mas se você lançar exceções, você deve informar a incapacidade de usar a conversão como parte de sua CanConvertTo implementação para que a prática recomendada de verificação com CanConvertTo primeiro evitar exceções é suportado.
If destinationType parameter is not of type String, you can choose your own converter handling. Normalmente, reverteria para a implementação base tratamento que o basemost ConvertTo gera uma exceção específica.
Implementing CanConvertTo
Your CanConvertTo implementation should return true for destinationType of type String, and otherwise defer to the base implementation.
Implementing CanConvertFrom
Your CanConvertFrom implementation should return true for sourceType of type String, and otherwise defer to the base implementation.
Applying the TypeConverterAttribute
Para que o conversor de tipo personalizado a ser usado como a agir conversor de tipo de uma classe personalizada por um processador XAML, você deve aplicar o .NET Framework attribute TypeConverterAttribute em sua definição de classe. The ConverterTypeName that you specify through the attribute must be the type name of your custom type converter. Com esse atributo aplicado, quando um processador XAML manipula valores onde o tipo de propriedade usa o tipo de classe personalizada, ele pode seqüências de caracteres de entrada e retornar as instâncias de objeto.
You can also provide a type converter on a per-property basis. Em vez de aplicar um .NET Framework attribute TypeConverterAttribute na 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). The type of the property must match the type that is processed by your custom type converter. Com esse atributo aplicado, quando um XAMLprocessor manipula os valores dessa propriedade, ela pode processar seqüências de caracteres de entrada e retornar as instâncias de objeto. The per-property type converter technique is particularly useful if you choose to use a property type from Microsoft .NET Framework or from some other library where you cannot control the class definition and cannot apply a TypeConverterAttribute there.