Resumo do Capítulo 10. Extensões de marcação XAML

Baixar exemplo Baixar o exemplo

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 concluídos.

Normalmente, o analisador XAML converte qualquer conjunto de cadeias de caracteres 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 um TypeConverter derivado anexado à 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 ou campo estático 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 têm suporte em todas as implementações de XAML:

Essas quatro extensões de marcação XAML têm suporte em muitas implementações de XAML, incluindo Xamarin.Forms:

Uma extensão de marcação XAML adicional está incluída em em Xamarin.Forms conexão com RelativeLayout:

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 da Member propriedade 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 estabelecer 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. No 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 das finalidades

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 de ResourceSharing . Você pode usar um StaticResourceExtension elemento ou StaticResource em chaves:

de tela tripla do compartilhamento de recursos de compartilhamento de recursos

Não confunda a x:Static extensão de marcação e a StaticResource extensão de marcação.

Uma árvore de dicionários

Quando o analisador XAML encontra um StaticResource, ele começa a pesquisar uma chave correspondente na árvore visual e, em seguida, procura na ResourceDictionary classe do App aplicativo. Isso permite que os itens em um dicionário de recursos mais profundos 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 a StaticResource é DynamicResource, que mantém um link para a chave de dicionário e atualiza o destino quando o item referenciado pela chave é alterado.

A diferença entre StaticResource e DynamicResource é demonstrada no exemplo DynamicVsStatic .

Uma propriedade definida por DynamicResource deve ser apoiada por uma propriedade associável, conforme discutido no Capítulo 11, a infraestrutura associá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 como um objeto .NET Type .

Use x:Array para definir uma matriz. Especifique o tipo de 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 atende a esses requisitos. Ele cria um valor do tipo Color com base nos valores das propriedades denominadas H, S, Le A. Essa classe é o primeiro item em uma Xamarin.Forms biblioteca chamada Xamarin.FormsBook.Toolkit que é criada 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.