Definir e usar recursos

Concluído

Um recurso é como uma constante simbólica de uma linguagem de programação. Você o define em um lugar e faz referência a ele em qualquer lugar que precise dele. Seu código é mais fácil de ler porque você usa um nome descritivo em vez de um valor "mágico". Se você precisar alterar o valor, será necessário apenas atualizar a definição.

Neste módulo, você verá como usar recursos para eliminar valores codificados do seu XAML.

O que é um recurso?

Um recurso é qualquer objeto que pode ser compartilhado em sua interface do usuário. Os exemplos mais comuns são fontes, cores e tamanhos. No entanto, também é possível armazenar objetos complexos, como instâncias Style e OnPlatform, como recursos.

Você pode definir um recurso em XAML ou código. Então você o aplica em XAML ou código. Normalmente, você trabalha inteiramente em XAML, embora mostremos alguns casos mais adiante em que o código é útil.

Considere um exemplo. Suponha que você queira usar os mesmos valores TextColor em todos os controles de uma página. Se você usar valores embutidos em código, seu XAML terá a seguinte aparência. Observe como o valor para a cor do texto é repetido em dois controles.

<Label TextColor="Blue" FontSize="14">
<Button TextColor="Blue" FontSize="14">

Em vez de repetir a cor do texto, você pode defini-la como um recurso. A definição é semelhante a este XAML:

<Color x:Key="PageControlTextColor">Blue</Color>

Observe como o elemento definido tem uma propriedade x:Key que fornece ao recurso um nome. Você usa essa chave para pesquisar o recurso no XAML.

Antes de usar um recurso, você deve armazená-lo em um dicionário de recursos.

O que é um ResourceDictionary?

O ResourceDictionary é uma classe da biblioteca .NET MAUI personalizada para uso com recursos da interface do usuário. Trata-se de um dicionário, ou seja, armazena pares chave-valor. O tipo de chave está limitado a String, mas o valor pode ser qualquer objeto.

Cada página XAML do .NET MAUI tem uma propriedade Recursos que podem ter um objeto ResourceDictionary. A propriedade é nula por padrão, portanto, você precisa criar uma instância do dicionário antes de usá-la. O código a seguir mostra como criar um objeto ResourceDictionary para atribuí-lo à propriedade Recursos de uma ContentPage:

<ContentPage.Resources>
    <ResourceDictionary>
        ...
    </ResourceDictionary>
</ContentPage.Resources>

O XAML do .NET MAUI tem uma sintaxe de conveniência interna que cria a instância do dicionário automaticamente sempre que você começa a usar a propriedade Recursos. O exemplo anterior pode ser simplificado para o seguinte código:

<ContentPage.Resources>
    ...
</ContentPage.Resources>

Cada página do aplicativo pode ter o próprio dicionário. Use esses dicionários específicos de página para armazenar recursos que são usados exclusivamente nessa página.

Observação

Cada controle em uma página também pode ter o próprio dicionário de recursos. Por exemplo, é possível adicionar um diretório de recursos em um controle Label da seguinte maneira:

<Label Text="Hello, World!"
        ...
        <Label.Resources>
           ...
        </Label.Resources>
</Label>

Além de layouts e visualizações, que podem conter elementos filho, não é comum fazer isso no nível do controle.

Criar um recurso

Para criar um recurso, declare-o na propriedade Recursos de uma página. O exemplo a seguir cria o recurso text-color descrito anteriormente

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

Ao selecionar uma chave para o recurso, escolha um nome que reflita o uso em vez do valor do recurso. Por exemplo, para definir o plano de fundo de um rótulo como vermelho, não use RedColor como a chave, mas BackgroundColor.

Aplicar um recurso usando StaticResource

StaticResource é uma extensão de marcação para procurar recursos em um dicionário de recursos. Você fornece a chave do recurso e a extensão de marcação retorna o valor correspondente. A marcação XAML a seguir mostra um exemplo que cria e usa um recurso Color chamado PageControlTextColor. A marcação XAML para o controle de rótulo no exemplo usa a extensão de marcação StaticResource para recuperar o valor.

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

...

<Label TextColor="{StaticResource PageControlTextColor}" ... />

A extensão é chamada StaticResource porque a extensão é avaliada somente uma vez. A pesquisa de dicionário ocorre quando o objeto de destino é criado. A propriedade de destino não será atualizada se o valor de recurso no dicionário mudar.

Aviso

StaticResource lança uma exceção de runtime caso a chave não seja encontrada.

Tipos intrínsecos do XAML

O exemplo original apresentado no início desta unidade define as propriedades TextColor e FontSize:

<Label TextColor="Blue" FontSize="14">
<Button TextColor="Blue" FontSize="14">

A FontSize é do tipo Duplo. Para criar um recurso para esse valor, use um dos tipos intrínsecos de XAML definidos na especificação XAML. A especificação XAML define nomes de tipo para muitos dos tipos simples de C#. O código a seguir mostra recursos de exemplo para cada um dos tipos intrínsecos.

<ContentPage.Resources>
    <x:String x:Key="...">Hello</x:String>
    <x:Char x:Key="...">X</x:Char>
    <x:Single x:Key="...">31.4</x:Single>
    <x:Double x:Key="...">27.1</x:Double>
    <x:Byte x:Key="...">8</x:Byte>
    <x:Int16 x:Key="...">16</x:Int16>
    <x:Int32 x:Key="...">32</x:Int32>
    <x:Int64 x:Key="...">64</x:Int64>
    <x:Decimal x:Key="...">12345</x:Decimal>
    <x:TimeSpan x:Key="...">1.23:5959</x:TimeSpan>
    <x:Boolean x:Key="...">True</x:Boolean>
</ContentPage.Resources>

Definir valores específicos da plataforma para um recurso

É comum precisar ajustar um pouco a interface do usuário do seu aplicativo entre plataformas. A maneira padrão de definir os valores específicos da plataforma é usando um objeto OnPlatform ao definir um recurso. Por exemplo, o código a seguir mostra como criar um recurso que faz referência a diferentes cores de texto no iOS, no Android, no macOS (Mac Catalyst) e no Windows (WinUI).

<ContentPage.Resources>
    <OnPlatform x:Key="textColor" x:TypeArguments="Color">
        <On Platform="iOS" Value="Silver" />
        <On Platform="Android" Value="Green" />
        <On Platform="WinUI" Value="Yellow" />
        <On Platform="MacCatalyst" Value="Pink" />
    </OnPlatform> 
</ContentPage.Resources>
...

<Label TextColor="{StaticResource textColor}" ... />

Verificação de conhecimento

1.

O valor ao qual um StaticResource se refere é atribuído a uma variável. O que acontece quando o valor muda?