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:
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
ePage
para baixo para estilos definidos em layouts inferiores na árvore visual. - De estilos definidos para classes base, como
VisualElement
eView
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:
BodyStyleKey
igual a "BodyStyle"TitleStyleKey
igual a "TitleStyle"SubtitleStyleKey
igual a "SubtitleStyle"CaptionStyleKey
igual a "CaptionStyle"ListItemTextStyleKey
igual a "ListItemTextStyle"ListItemDetailTextStyleKey
igual a "ListItemDetailTextStyle"
Esses estilos são ilustrados pelo exemplo DeviceStylesList.