Estilos dinâmicos
A classe de estilo não deriva de "BindableObject" e não responde internamente a mudanças em suas propriedades. Por exemplo, se você atribuir um estilo e opor-se a um elemento, e em seguida, modificar um dos objetos "setter", dando-lhe um novo valor, o novo valor não vai aparecer no elemento. Da mesma forma, o elemento de destino não vai mudar se você adicionar um "setter" ou remover um "setter" da coleção "setters". Para estes novos "setters" de propriedade terem efeito, você precisa usar o código para destacar o estilo do elemento, definindo a propriedade Estilo para nulo, e em seguida, anexar novamente o estilo para o elemento.
No entanto, sua aplicação pode responder ao estilo mudando dinamicamente em tempo de execução através da utilização de "DynamicResource". Você deve se lembrar que "DynamicResource" é semelhante ao "StaticResource" aonde ele usa uma chave de dicionário para buscar um objeto ou um valor de um dicionário de recurso. A diferença é que "StaticResource" é um dicionário de pesquisa de uma só vez enquanto "DynamicResource" mantém uma ligação para a real chave de dicionário. Se a entrada do dicionário associada com essa chave é substituída por um novo objeto, essa alteração será propagada para o elemento.
Esta facilidade permite que um aplicativo implemente um recurso chamado às vezes de estilos dinâmicos. Por exemplo, você pode incluir uma instalação em seu programa para temas estilísticos (envolvendo fontes e cores talvez), e você pode fazer estes temas selecionáveis pelo usuário. O aplicativo pode alternar entre estes temas porque eles são implementados com estilos.
Não há nada em um estilo que indique que é um estilo dinâmico. Um estilo torna-se dinamicamente único sendo referenciado usando "DynamicResource" ao invés de StaticResource".
A seção recursos define quatro estilos: um estilo simples, com a tecla baseButtonStyle", e em seguida, três estilos que derivam daquele estilo com as teclas "buttonStyle1", "buttonStyle2" , e "buttonStyle3".
No entanto, os quatro elementos do botão em direção a parte inferior do arquivo "XAML" usam "DynamicResource" para fazer referência a um estilo com a chave mais simples "ButtonStyle". Onde está o estilo com essa chave? Isso não existe. No entanto, como as quatro propriedades estilo são definidas com "DynamicResource", a falta da chave de dicionário não é um problema. Nenhuma exceção é levantada. Mas nenhum estilo é aplicado, o que significa que os botões têm uma aparência padrão:
Cada um dos quatro elementos "Button" tem um manipulador "Click" em anexo, e no arquivo "code-behind", os primeiros três manipuladores definem uma entrada do dicionário com a tecla "ButtonStyle" para um dos três estilos numerados já definidos no dicionário:
Quando você pressiona um dos três primeiros botões, todos os quatro obtém o estilo selecionado. Aqui está o programa executando em todas as três plataformas que mostram os resultados (da esquerda para a direita) quando os botões 1, 2, e 3 são pressionados:
Pressionando o quarto botão tudo retorna as condições iniciais, definindo o valor associado a a tecla "ButtonStyle" como nulo. (Você também pode considerar chamar "Remove" ou "Clean" no objeto "ResourceDictionary" para remover a chave inteiramente, mas que não funciona na versão "Xamarin.Forms" utilizada neste capítulo.)
Suponha que você queira derivar outro estilo do estilo com a tecla "ButtonStyle". Como você faz isso no XAML, considerando que a entrada de dicionário "ButtonStyle" não existe até que um dos primeiros três botões é pressionado?
Você não pode fazer desta maneira:
"StaticResource" irá lançar uma exceção se a tecla "ButtonStyle" não existir, e mesmo se a chave existir, o uso de "StaticResource" não vai permitir que mudanças na entrada do dicionário sejam refletidas neste novo estilo.
No entanto, alterar "StaticResource" para "DynamicResource" não vai funcionar:
"DynamicResource" funciona apenas com propriedades garantidas por propriedades vinculáveis , e que não é o caso aqui. Estilo não deriva de "bindableobject", por isso não pode suportar propriedades vinculáveis.
Em vez disso, estilos definem uma propriedade especificamente para o fim de herdar estilos dinâmicos. A propriedade é a "BaseResourceKey", que se destina a ser fixada diretamente a uma chave de dicionário que pode ainda não existir ou cujo valor pode mudar dinamicamente, que é o caso com a tecla "ButtonStyle":
O uso de "BaseResourceKey" é demonstrado pelo projeto "DynamicStylesInheritance", que é muito semelhante ao projeto "DynamicStyles". Na verdade, o processamento de código subjacente é idêntico. Na parte inferior da seção de recursos, um novo estilo é definido com uma chave de "newButtonStyle" que usa "BaseResourceKey" para referenciar a entrada "ButtonStyle" e adicionar um par de propriedades, incluindo um que utiliza "OnPlatform":
Repare que os primeiros três elementos "Button" referenciam a entrada de dicionário "newButtonStyle" com "StaticResource". "DynamicResource" não é necessária aqui, porque o objeto de estilo associado ao "newButtonStyle" em si não vai mudar, exceto para o estilo que deriva dele. O estilo com a tecla "newButtonStyle" mantém uma ligação com "ButtonStyle" e, internamente, altera-se quando ocorrem mudanças de estilo. Quando o programa começa a ser executado, apenas as propriedades definidas na "newButtonStyle" são aplicadas a esses três botões:
O botão "Reset" continua a fazer referência a entrada "ButtonStyle".
Como no programa "DynamicStyles", o arquivo "code-behind" define a entrada de dicionário quando você clica em um dos três primeiros botões, para que todos os botões peguem as propriedades "ButtonStyle" também. Aqui estão os resultados para (da esquerda para a direita) os cliques dos botões 3 , 2 e 1: