Definování a používání prostředků

Dokončeno

Prostředek je jako symbolická konstanta z programovacího jazyka. Definujete ho na jednom místě a budete na něj odkazovat všude, kde ho potřebujete. Kód je čitelnější, protože místo "magické" hodnoty použijete popisný název. Pokud potřebujete změnit hodnotu, stačí aktualizovat pouze definici.

V tomto modulu se dozvíte, jak pomocí prostředků eliminovat pevně zakódované hodnoty z XAML.

Co je prostředek?

Prostředek je libovolný objekt, který je možné sdílet v uživatelském rozhraní. Nejběžnějšími příklady jsou písma, barvy a velikosti. Můžete však také uložit složité objekty, jako jsou styly a onPlatform instance jako prostředky.

Prostředek definujete v xaml nebo kódu. Pak ho použijete v xaml nebo kódu. Obvykle pracujete zcela v JAZYCE XAML, i když vám ukážeme několik případů později, kde je kód užitečný.

Představte si příklad. Předpokládejme, že chcete použít stejné hodnoty TextColor napříč ovládacími prvky na stránce. Pokud jste použili pevně zakódované hodnoty, bude xaml vypadat takto. Všimněte si, jak se hodnota barvy textu opakuje v obou ovládacích prvcích.

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

Místo opakování barvy textu ji můžete definovat jako prostředek. Definice vypadá takto:

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

Všimněte si, že definovaný prvek má vlastnost x:Key , která dává prostředku název. Tento klíč použijete k vyhledání prostředku v XAML.

Než budete moct prostředek použít, musíte ho uložit do slovníku prostředků.

Co je ResourceDictionary?

ResourceDictionary je třída knihovny .NET MAUI přizpůsobená pro použití s prostředky uživatelského rozhraní. Je to slovník, takže ukládá páry klíč/hodnota. Typ klíče je omezen na String, zatímco hodnota může být libovolný objekt.

Každá stránka XAML .NET MAUI má vlastnost s názvem Resources , která může obsahovat objekt ResourceDictionary . Vlastnost má ve výchozím nastavení hodnotu null, takže musíte vytvořit instanci slovníku, abyste ji mohli použít. Následující kód ukazuje, jak vytvořit ResourceDictionary objekt a přiřadit ho k Resources vlastnost ContentPage:

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

.NET MAUI XAML má integrovanou syntaxi usnadnění, která automaticky vytvoří instanci slovníku pokaždé, když začnete používat vlastnost Resources . Předchozí příklad lze zjednodušit následujícím kódem:

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

Každá stránka v aplikaci může mít svůj vlastní slovník. Tyto slovníky specifické pro stránky slouží k ukládání prostředků, které se používají výhradně na této stránce.

Poznámka:

Každý ovládací prvek na stránce může mít také vlastní slovník prostředků. Adresář prostředků můžete například přidat do ovládacího prvku Popisek takto:

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

Kromě rozložení a zobrazení, která můžou obsahovat podřízené prvky, není běžné to udělat na úrovni ovládacího prvku.

Vytvoření prostředku

Pokud chcete vytvořit prostředek, deklarujete ho uvnitř vlastnosti Resources pro stránku. Následující příklad vytvoří prostředek barvy textu popsaný výše.

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

Když pro prostředek vyberete klíč, zvolte název, který místo hodnoty prostředku odpovídá použití. Pokud chcete například nastavit pozadí popisku na Red, nepoužívejte jako klíč RedColor, místo toho použijte BackgroundColor.

Použití prostředku pomocí StaticResource

StaticResource je rozšíření značek pro vyhledávání prostředků ve slovníku prostředků. Zadáte klíč prostředku a rozšíření značek vrátí odpovídající hodnotu. Následující mark-up XAML ukazuje příklad, který vytvoří a používá Color prostředek s názvem PageControlTextColor. Značka XAML pro ovládací prvek popisku v příkladu používá rozšíření staticResource značek k načtení hodnoty.

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

...

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

Rozšíření se nazývá StaticResource , protože se rozšíření vyhodnotí pouze jednou. Při vytváření cílového objektu dojde k vyhledání slovníku. Cílová vlastnost se neaktualizuje, pokud se změní hodnota prostředku ve slovníku.

Upozorňující

StaticResource vyvolá výjimku modulu runtime, pokud se klíč nenajde.

Vnitřní typy XAML

Původní příklad uvedený na začátku této lekce nastaví TextColor vlastnost a FontSize vlastnost:

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

FontSize má typ Double. K vytvoření prostředku pro tuto hodnotu použijete jeden z vnitřních typů XAML definovaných ve specifikaci XAML. Specifikace XAML definuje názvy typů pro mnoho jednoduchých typů jazyka C#. Následující kód ukazuje ukázkové prostředky pro každý vnitřní typ.

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

Nastavení hodnot specifických pro platformu pro prostředek

Mezi platformami je běžné upravit uživatelské rozhraní vaší aplikace. Standardní způsob, jak definovat hodnoty specifické pro platformu, je použití onPlatform objektu při definování prostředku. Následující kód například ukazuje, jak vytvořit prostředek, který odkazuje na různé barvy textu v systémech iOS, Android, macOS (Mac Catalyst) a 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}" ... />

Prověrka znalostí

1.

Hodnota, ke které StaticResource se odkazuje, je přiřazena proměnné. Co se stane, když se hodnota změní?