Usar e atualizar recursos dinâmicos

Concluído

Na unidade anterior, você definiu um recurso em XAML e o usou como um valor estático. No entanto, há alguns casos em que StaticResource não é adequado. Considere os seguintes cenário:

  • Suponha que você deseja implementar temas de cores que permitem ao usuário alterar a aparência do aplicativo em runtime. A extensão de marcação StaticResource faz a pesquisa de dicionário apenas uma vez, portanto, não pode atualizar a interface do usuário dinamicamente.

  • Você armazena as preferências do usuário em um servidor Web e as carrega quando o aplicativo é iniciado. A extensão de marcação StaticResource gerará uma exceção se a chave não for encontrada no dicionário.

Esta unidade mostra como lidar com problemas como esses usando recursos dinâmicos.

Como atualizar recursos em runtime

Você armazena recursos em um dicionário de recursos. Você pode escrever código para atualizar esses recursos em runtime. Você pode até mesmo adicionar novos recursos ou remover recursos existentes.

Considere o seguinte exemplo:

<ContentPage.Resources>
    <Color x:Key="PanelBackgroundColor">Blue</Color>
</ContentPage.Resources>

Suponha que você deseja alterar o valor do recurso PanelBackgroundColor enquanto o aplicativo está em execução. Você pode adicionar código ao arquivo code-behind da página para acessar a propriedade Recursos. O exemplo a seguir atualiza o valor do recurso do exemplo de XAML anterior para uma cor diferente.

this.Resources["PanelBackgroundColor"] = Colors.Green;

O que é DynamicResource?

DynamicResource é outra extensão de marcação para procurar recursos em um dicionário de recursos. É semelhante a StaticResource no sentido de que faz uma pesquisa de dicionário quando o objeto de destino é criado. No entanto, também escuta alterações ao recurso no dicionário. Se o valor do recurso no dicionário for alterado, DynamicResource atualizará automaticamente a interface do usuário.

DynamicResource tem uma vantagem sobre StaticResource. Se DynamicResource não conseguir encontrar a chave no dicionário, ele deixará a propriedade não definida. Diferente de StaticResource, uma chave ausente não é um erro nem gera uma exceção.

Observação

A natureza da extensão de marcação DynamicResource impõe uma pequena penalidade de desempenho ao seu aplicativo. Embora você possa usar DynamicResource no lugar de StaticResource em suas páginas XAML, se um recurso não for alterado, você deverá fazer referência a ele com a extensão de marcação StaticResource.

Para usar a cor da tela de fundo atualizada do exemplo anterior, você pode aplicar o DynamicResource no código XAML desta forma:

<ContentPage ...>
    <ContentPage.Resources>
        <Color x:Key="PanelBackgroundColor">Blue</Color>
    </ContentPage.Resources>

    <StackLayout BackgroundColor="{DynamicResource PanelBackgroundColor}">
    ...
    </StackLayout>
</ContentPage>

Se o valor do recurso PanelBackgroundColor for alterado, o valor de BackgroundColor do controle StackLayout será atualizado automaticamente.

Verificação de conhecimentos

1.

Qual recurso um DynamicResource fornece que um StaticResource não fornece?