Resumo do Capítulo 10. Extensões de marcação XAML
Observação
Este livro foi publicado na primavera de 2016, e não foi atualizado desde então. Há muito no livro que permanece valioso, mas parte do material está desatualizado, e alguns tópicos não estão mais totalmente corretos ou completos.
Normalmente, o analisador XAML converte qualquer cadeia de caracteres definida como um valor de atributo para o tipo da propriedade com base em conversões padrão para os tipos de dados .NET básicos ou uma TypeConverter
derivada anexada à propriedade ou seu tipo com um TypeConverterAttribute
.
Mas às vezes é conveniente definir um atributo de uma fonte diferente, por exemplo, um item em um dicionário, ou o valor de uma propriedade estática ou campo, ou de um cálculo de algum tipo.
Esse é o trabalho de uma extensão de marcação XAML. Apesar do nome, as extensões de marcação XAML não são uma extensão para XML. XAML é sempre XML legal.
A infraestrutura de código
Uma extensão de marcação XAML é uma classe que implementa a IMarkupExtension
interface. Essa classe geralmente tem a palavra Extension
no final de seu nome, mas geralmente aparece em XAML sem esse sufixo.
As seguintes extensões de marcação XAML são suportadas por todas as implementações de XAML:
x:Static
apoiada porStaticExtension
x:Reference
apoiada porReferenceExtension
x:Type
apoiada porTypeExtension
x:Null
apoiada porNullExtension
x:Array
apoiada porArrayExtension
Essas quatro extensões de marcação XAML são suportadas por muitas implementações de XAML, incluindo Xamarin.Forms:
StaticResource
apoiada porStaticResourceExtension
DynamicResource
apoiada porDynamicResourceExtension
Binding
apoiado porBindingExtension
—discutido no Capítulo 16. Vinculação de dadosTemplateBinding
apoiado porTemplateBindingExtension
—não abordado no livro
Uma extensão de marcação XAML adicional está incluída em Xamarin.Forms conexão com RelativeLayout
:
ConstraintExpression
—não abordado no livro
Acessando membros estáticos
Use o x:Static
elemento para definir um atributo para o valor de uma propriedade estática pública, campo ou membro de enumeração. Defina a Member
propriedade como o membro estático. Geralmente é mais fácil especificar x:Static
e o nome do membro em chaves. O nome do Member
imóvel não precisa ser incluído, apenas o próprio membro. Essa sintaxe comum é mostrada no exemplo SharedStatics . Os próprios campos estáticos são definidos na AppConstants
classe. Essa técnica permite que você estabeleça constantes usadas por meio de um programa.
Com uma declaração de namespace XML adicional, você pode fazer referência a propriedades estáticas públicas, campos ou membros de enumeração definidos no .NET framework, conforme demonstrado no exemplo SystemStatics.
Dicionários de recurso
A VisualElement
classe define uma propriedade chamada Resources
que você pode definir como um objeto do tipo ResourceDictionary
. Em XAML, você pode armazenar itens neste dicionário e identificá-los com o x:Key
atributo. Os itens armazenados no dicionário de recursos são compartilhados entre todas as referências ao item.
StaticResource para a maioria dos propósitos
Na maioria dos casos, você usará a StaticResource
extensão de marcação para fazer referência a um item do dicionário de recursos, conforme demonstrado pelo exemplo ResourceSharing . Você pode usar um StaticResourceExtension
elemento ou StaticResource
dentro de chaves:
Não confunda a extensão de x:Static
marcação e a extensão de StaticResource
marcação.
Uma árvore de dicionários
Quando o analisador XAML encontra um StaticResource
, ele começa a procurar uma chave correspondente na árvore visual e, em seguida, procura na ResourceDictionary
classe do aplicativo App
. Isso permite que itens em um dicionário de recursos mais profundo na árvore visual substituam um dicionário de recursos mais alto na árvore visual. Isso é demonstrado no exemplo ResourceTrees .
DynamicResource para fins especiais
A StaticResource
extensão de marcação faz com que um item seja recuperado do dicionário quando uma árvore visual é criada durante a InitializeComponent
chamada. Uma alternativa para StaticResource
é DynamicResource
, que mantém um link para a chave do dicionário e atualiza o destino quando o item referenciado pela chave é alterado.
A diferença entre StaticResource
e DynamicResource
é demonstrada na amostra DynamicVsStatic .
Uma propriedade definida por DynamicResource
deve ser apoiada por uma propriedade vinculável, conforme discutido no Capítulo 11, A infraestrutura vinculável.
Extensões de marcação menos usadas
Use a x:Null
extensão de marcação para definir uma propriedade como null
.
Use a x:Type
extensão de marcação para definir uma propriedade para um objeto .NET Type
.
Use x:Array
para definir uma matriz. Especifique o tipo dos membros da matriz definindo a propriedade [Type
] como uma x:Type
extensão de marcação.
Uma extensão de marcação personalizada
Você pode criar suas próprias extensões de marcação XAML escrevendo uma classe que implementa a IMarkupExtension
interface com um ProvideValue
método.
A HslColorExtension
classe satisfaz esses requisitos. Ele cria um valor de tipo Color
com base em valores de propriedades chamadas H
, S
, L
e A
. Essa classe é o primeiro item de uma Xamarin.Forms biblioteca chamada Xamarin.FormsBook.Toolkit que é construída e usada ao longo deste livro.
O exemplo CustomExtensionDemo demonstra como fazer referência a essa biblioteca e usar a extensão de marcação personalizada.