Resumo do Capítulo 12. Estilos

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.

No Xamarin.Forms, os estilos permitem que várias exibições compartilhem uma coleção de configurações de propriedade. Isso reduz a marcação e permite manter temas visuais consistentes.

Os estilos são quase sempre definidos e consumidos na marcação. Um objeto do tipo Style é instanciado em um dicionário de recursos e, em seguida, definido como a Style propriedade de um elemento visual usando uma StaticResource extensão de marcação ou DynamicResource .

O estilo básico

Um Style requer que ele TargetType seja definido como o tipo do objeto visual ao qual ele se aplica. Quando um Style é instanciado em um dicionário de recursos (como é comum), ele também requer um x:Key atributo.

O Style tem uma propriedade de conteúdo do tipo Setters, que é uma coleção de Setter objetos. Cada Setter um associa um Property a um Value.

No XAML, a Property configuração é o nome de uma propriedade CLR (como a Text propriedade de Button), mas a propriedade estilizada deve ser apoiada por uma propriedade associável. Além disso, a propriedade deve ser definida na classe indicada pela configuração TargetType ou herdada por essa classe.

Você pode especificar a Value configuração usando o elemento <Setter.Value>de propriedade . Isso permite que você defina Value como um objeto que não pode ser expresso em uma cadeia de caracteres de texto ou em um OnPlatform objeto ou em um objeto instanciado usando x:Arguments ou x:FactoryMethod. A Value propriedade também pode ser definida com uma StaticResource expressão para outro item no dicionário.

O programa BasicStyle demonstra a sintaxe básica e mostra como referenciar o Style com uma StaticResource extensão de marcação:

Captura de tela tripla do estilo básico

O Style objeto e qualquer objeto criado no Style objeto como uma Value configuração são compartilhados entre todas as exibições que fazem referência a esse Style. O Style não pode conter nada que não possa ser compartilhado, como um View derivado.

Os manipuladores de eventos não podem ser definidos em um Style. A GestureRecognizers propriedade não pode ser definida em um Style porque não é apoiada por uma propriedade associável.

Estilos no código

Embora não seja comum, você pode instanciar e inicializar Style objetos no código. Isso é demonstrado pelo exemplo BasicStyleCode .

Herança de estilo

Style tem uma BasedOn propriedade que você pode definir como uma StaticResource extensão de marcação referenciando outro estilo. Isso permite que os estilos herdem de estilos anteriores e adicionem ou substituam as configurações de propriedade. O exemplo StyleInheritance demonstra isso.

Se Style2 for baseado em Style1, o TargetType de Style2 deverá ser o mesmo Style1 que ou derivado de Style1. O dicionário de recursos no qual Style1 é armazenado deve ser o mesmo dicionário Style2 de recursos que ou um dicionário de recursos superior na árvore visual.

Estilos implícitos

Se um Style em um dicionário de recursos não tiver uma configuração x:Key de atributo, ele será atribuído automaticamente a uma chave de dicionário e o Style objeto se tornará um estilo implícito. Uma exibição sem uma Style configuração e cujo tipo corresponde exatamente ao TargetType encontrará esse estilo, como demonstra o exemplo ImplicitStyle .

Um estilo implícito pode derivar de um Style com uma configuração x:Key , mas não o contrário. Você não pode referenciar explicitamente um estilo implícito.

Você pode implementar três tipos de hierarquia com estilos e BasedOn:

  • De estilos definidos no Application e Page para baixo até estilos definidos em layouts mais baixos na árvore visual.
  • De estilos definidos para classes base, como VisualElement e View para estilos definidos para classes específicas.
  • De estilos com chaves de dicionário explícitas a estilos implícitos.

Essas hierarquias são demonstradas no exemplo StyleHierarchy .

Estilos dinâmicos

Um estilo em um dicionário de recursos pode ser referenciado por DynamicResource em vez de StaticResource. Isso torna o estilo um estilo dinâmico. Se esse estilo for substituído no dicionário de recursos por outro estilo com a mesma chave, as exibições que referenciam esse estilo serão DynamicResource alteradas automaticamente. Além disso, a ausência de uma entrada de dicionário com a chave especificada causará StaticResource uma exceção, mas não DynamicResource.

Você pode usar essa técnica para alterar dinamicamente o estilo ou os temas, como demonstra o exemplo DynamicStyles .

No entanto, você não pode definir a BasedOn propriedade como uma DynamicResource extensão de maquiagem porque BasedOn não tem o suporte de uma propriedade associável. Para derivar um estilo dinamicamente, não defina BasedOn. Em vez disso, defina a BaseResourceKey propriedade como a chave de dicionário do estilo do qual você deseja derivar. O exemplo DynamicStylesInheritance demonstra essa técnica.

Estilos de dispositivo

A Device.Styles classe aninhada define doze campos somente leitura estáticos para seis estilos com um TargetType dos Label que você pode usar para tipos comuns de usos de texto.

Seis desses campos são do tipo Style que você pode definir diretamente para uma Style propriedade no código:

Os outros seis campos são do tipo string e podem ser usados como chaves de dicionário para estilos dinâmicos:

Esses estilos são ilustrados pelo exemplo DeviceStylesList .