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 é apropriado. Considere os seguintes cenários:

  • Suponha que você queira implementar temas de cores que permitam ao usuário alterar a aparência do aplicativo em tempo de execução. A extensão de marcação StaticResource faz a pesquisa do 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 lança 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 tempo de execução

Você armazena recursos em um dicionário de recursos. Você pode escrever código para atualizar esses recursos em tempo de execução. 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ê queira 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 Resources . O exemplo a seguir atualiza o valor do recurso do exemplo 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 ao StaticResource na medida em que faz uma pesquisa de dicionário quando o objeto de destino é criado. Mas também escuta as mudanças no recurso no dicionário. Se o valor do recurso no dicionário for alterado, o 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, isso deixará a propriedade desdefinida. Ao contrário de StaticResource, uma chave ausente não é um erro e não lança uma exceção.

Nota

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 de plano de fundo atualizada do exemplo anterior, você pode aplicar o DynamicResource em seu código XAML da seguinte 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 BackgroundColor do controle StackLayout será atualizado automaticamente.

Verificação de conhecimento

1.

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