Definir e usar recursos
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}" ... />