Compartilhar via


Resumo do Capítulo 12. Estilos

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.

No Xamarin.Forms, os estilos permitem que várias vistas 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 or DynamicResource .

O estilo básico

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

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

Em 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 TargetType pela configuração 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 para um OnPlatform objeto, ou para 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 fazer referência ao 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 que faz referência a outro estilo. Isso permite que os estilos herdem de estilos anteriores e adicionem ou substituam configurações de propriedade. O exemplo StyleInheritance demonstra isso.

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

Estilos implícitos

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

Um estilo implícito pode derivar de uma Style configuração with x:Key , mas não o contrário. Você não pode fazer referência explícita a 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 para estilos definidos em layouts inferiores 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 fazem referência a esse estilo serão DynamicResource alteradas automaticamente. Além disso, a ausência de uma entrada de dicionário com a chave especificada fará com que StaticResource uma exceção seja gerada, mas não DynamicResource.

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

No entanto, você não pode definir a BasedOn propriedade como uma DynamicResource extensão de composição porque BasedOn não é apoiada por 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 estáticos somente leitura para seis estilos com um TargetType of 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.