Criar e usar recursos de todo o aplicativo
Definir estilos e recursos em uma página XAML é uma ótima maneira de reduzir código repetido. No entanto, há um problema. Esses estilos e recursos só estão disponíveis naquela página XAML específica. Dicionários de recursos em nível de página não são suficientes para permitir que você evite código repetido em um aplicativo quando há várias páginas. Nessa unidade, você verá como compartilhar recursos e estilos em todas as páginas do seu aplicativo.
Em que local os dicionários de recursos estão disponíveis
A classe VisualElement define a propriedade Resources. Controles, páginas e layouts herdam do VisualElement. Portanto, todos eles têm uma propriedade Resources que pode conter um dicionário de recursos.
A classe Application também define uma propriedade Resources. O aplicativo não herda do VisualElement. Portanto, a propriedade é definida como parte dessa classe.
A ilustração a seguir mostra a estrutura de um aplicativo típico. Cada um dos elementos mostrados tem uma propriedade Resources que pode conter um dicionário de recursos.
Observação
Este diagrama mostra uma representação muito simplificada de como os itens em um aplicativo são organizados. Nesse diagrama, o termo Exibição refere-se a um controle singleton, como Botão ou Rótulo, que não atua como um contêiner para nenhum controle filho. Além disso, o termo Layout implica um contêiner responsável por organizar o layout de seus controles filho. Um layout pode ser aninhado. Por exemplo, um controle Grid pode ser mantido dentro de um controle StackLayout.
Como definir estilos e recursos no nível do aplicativo
Você define os recursos e estilos no nível do aplicativo no arquivo XAML associado à classe Application. O código a seguir mostra como declarar um recurso Color no dicionário de recursos do aplicativo.
<Application.Resources>
<Color x:Key="MyTextColor">Blue</Color>
</Application.Resources>
Como o .NET MAUI localiza um recurso ou estilo
Suponha que você aplique um recurso a um de seus controles, conforme mostrado no código a seguir.
<Label TextColor="{StaticResource MyTextColor}" ... />
O .NET MAUI precisa localizar a definição desse recurso para que possa aplicar o valor. Um único aplicativo pode ter vários dicionários. Quais dicionários o .NET MAUI pesquisará e em qual ordem? Para responder a essas perguntas, ajuda pensar nas instâncias do VisualElement em páginas como formar uma estrutura semelhante a uma árvore. O aplicativo está na raiz com páginas, layouts e exibições de dispersão abaixo dele. Essa estrutura costuma ser chamada de árvore visual. Cada elemento na árvore pode ter seu próprio dicionário, que pode conter recursos. O algoritmo de pesquisa de estilo no .NET MAUI percorre a árvore visual:
Inicie a pesquisa com o dicionário na instância de VisualElement à qual o recurso é aplicado. No exemplo anterior, a pesquisa começa com o tipo Label. Se não houver um dicionário de recursos ou se ele tiver dicionário, mas esse recurso não existir, a pesquisa prosseguirá.
Vá para o pai do (controle) e repita a pesquisa. Normalmente, o próximo local a ser pesquisado é layout.
Verifique o pai do layout. Normalmente, o próximo lugar a ser pesquisado é a página. Embora se um layout estiver aninhado dentro de outro layout (como Grid dentro de um StackLayout), a pesquisa moverá para cima a árvore para o layout pai.
Procure no dicionário a classe Application.
A pesquisa retorna o primeiro item encontrado, com um valor x:Key correspondente. A imagem a seguir resume a sequência de pesquisa de recurso.
Na prática, a maioria dos desenvolvedores ignora a propriedade Resources em exibições e layouts. Eles usam os dicionários no nível da página para itens que usam em uma única página. Recursos e estilos que eles querem compartilhar entre várias páginas são definidos no nível do aplicativo. O processo de pesquisa então precisa apenas verificar dois dicionários: aquele na instância da página atual e aquele no aplicativo.
Observação
Se um recurso com a chave especificada não for encontrado, o aplicativo usará valores padrão para o estilo.
Chaves duplicadas
Cada instância de ResourceDictionary é independente, o que significa que o mesmo valor de x:Key pode ser usado em mais de um dicionário. Ter o mesmo identificador x:Key em vários dicionários no caminho da pesquisa não causará um erro. O recurso associado ao primeiro valor x:Key correspondente no caminho é o que será usado.
Por exemplo, suponha que você tenha o seguinte recurso definido na classe Application:
<Application.Resources>
<x:String x:Key="msg">Two</x:String>
</Application.Resources>
Você define o recurso a seguir em um ContentPage e o aplica a um Label na mesma página:
<ContentPage.Resources>
<x:String x:Key="msg">One</x:String>
</ContentPage.Resources>
...
<Label Text="{StaticResource msg}">
Devido ao fato de o primeiro valor x:Key correspondente ser usado, a propriedade Text é definida como One.