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ários modos de exibição 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 ou DynamicResource
marcação.
O estilo básico
A Style
requer que ele TargetType
seja definido para o tipo do objeto visual ao qual 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
.
Em XAML, a Property
configuração é o nome de uma propriedade CLR (como a Text
propriedade de ), mas a propriedade styled deve ser apoiada Button
por uma propriedade vinculável. Além disso, a propriedade deve ser definida na classe indicada pela TargetType
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
para 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 a 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 todos os modos de exibição 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
arquivo . A GestureRecognizers
propriedade não pode ser definida em um Style
porque não é apoiada por uma propriedade vinculá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 fazendo 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
é 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
está armazenado deve ser o mesmo dicionário Style2
de recursos 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 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
encontrará esse estilo, como demonstra o exemplo ImplicitStyle .
Um estilo implícito pode derivar de um Style
com uma x:Key
configuração, mas não o contrário. Não é possível 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
até estilos definidos em layouts inferiores na árvore visual. - Desde estilos definidos para classes base, como
VisualElement
eView
até estilos definidos para classes específicas. - De estilos com teclas 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
gere 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 é apoiada por uma propriedade vinculá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
dos Label
quais 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 .