Definiera och använda resurser

Slutförd

En resurs är som en symbolisk konstant från ett programmeringsspråk. Du definierar den på ett ställe och refererar till den överallt där du behöver den. Koden är lättare att läsa eftersom du använder ett beskrivande namn i stället för ett "magiskt" värde. Om du behöver ändra värdet behöver du bara uppdatera definitionen.

I den här modulen ser du hur du använder resurser för att eliminera hårdkodade värden från din XAML.

Vad är en resurs?

En resurs är alla objekt som kan delas i användargränssnittet. De vanligaste exemplen är teckensnitt, färger och storlekar. Du kan dock även lagra komplexa objekt som Format och OnPlatform-instanser som resurser.

Du definierar en resurs i antingen XAML eller kod. Sedan använder du den i antingen XAML eller kod. Vanligtvis arbetar du helt i XAML, även om vi visar dig några fall senare där kod är användbar.

Tänk dig ett exempel. Anta att du vill använda samma TextColor-värden i kontrollerna på en sida. Om du använde hårdkodade värden skulle XAML se ut så här. Observera hur värdet för textfärgen upprepas i de två kontrollerna.

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

I stället för att upprepa textfärgen kan du definiera den som en resurs. Definitionen ser ut så här XAML:

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

Observera hur det definierade elementet har en x:Key-egenskap som ger resursen ett namn. Du använder den här nyckeln för att leta upp resursen i din XAML.

Innan du kan använda en resurs måste du lagra den i en resursordlista.

Vad är ResourceDictionary?

ResourceDictionary är en .NET MAUI-biblioteksklass som är anpassad för användning med UI-resurser. Det är en ordlista, så den lagrar nyckel/värde-par. Typen av nyckel är begränsad till Sträng, medan värdet kan vara valfritt objekt.

Varje .NET MAUI XAML-sida har en egenskap med namnet Resurser som kan innehålla ett ResourceDictionary-objekt . Egenskapen är null som standard, så du måste skapa en ordlisteinstans innan du kan använda den. Följande kod visar hur du skapar ett ResourceDictionary-objekt och tilldelar det till egenskapen Resurser för en ContentPage:

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

.NET MAUI XAML har en inbyggd bekvämlighetssyntax som skapar ordlisteinstansen automatiskt när du börjar använda egenskapen Resurser . Föregående exempel kan förenklas till följande kod:

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

Varje sida i din app kan ha en egen ordlista. Du använder dessa sidspecifika ordlistor för att lagra resurser som endast används på den sidan.

Kommentar

Varje kontroll på en sida kan också ha en egen resursordlista. Du kan till exempel lägga till en resurskatalog i en etikettkontroll så här:

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

Förutom layouter och vyer, som kan innehålla underordnade element, är det inte vanligt att göra detta på kontrollnivå.

Skapa en resurs

Om du vill skapa en resurs deklarerar du den i egenskapen Resurser för en sida. I följande exempel skapas textfärgresursen som beskrevs tidigare

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

När du väljer en nyckel för resursen väljer du ett namn som återspeglar användningen i stället för resursens värde. Om du till exempel vill ange en etiketts bakgrund till Röd ska du inte använda RedColor som nyckel, använd BackgroundColor i stället.

Använda en resurs med hjälp av StaticResource

StaticResource är ett tillägg för att söka efter resurser i en resursordlista. Du anger resursnyckeln och markeringstillägget returnerar motsvarande värde. Följande XAML-markering visar ett exempel som skapar och använder en Color resurs med namnet PageControlTextColor. XAML-pålägget för etikettkontrollen i exemplet använder StaticResource-markeringstillägget för att hämta värdet.

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

...

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

Tillägget kallas StaticResource eftersom tillägget endast utvärderas en gång. Ordlistesökningen sker när målobjektet skapas. Målegenskapen uppdateras inte om resursvärdet i ordlistan ändras.

Varning

StaticResource utlöser ett körningsundundatag om nyckeln inte hittas.

XAML-inbyggda typer

I det ursprungliga exemplet som visas i början av den här lektionen anges egenskapen TextColor och egenskapen FontSize :

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

FontSize har typen Double. Om du vill skapa en resurs för det här värdet använder du en av de inbyggda XAML-typerna som definieras i XAML-specifikationen. XAML-specifikationen definierar typnamn för många av de enkla C#-typerna. Följande kod visar exempelresurser för var och en av de inbyggda typerna.

<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>

Ange plattformsspecifika värden för en resurs

Det är vanligt att behöva justera appens användargränssnitt något mellan plattformarna. Standardsättet för att definiera plattformsspecifika värden är att använda ett OnPlatform-objekt när du definierar en resurs. Följande kod visar till exempel hur du skapar en resurs som refererar till olika textfärger i iOS, Android, macOS (Mac Catalyst) och 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}" ... />

Kunskapstest

1.

Värdet som en StaticResource refererar till tilldelas till en variabel. Vad händer när värdet ändras?