Rozšíření značek XAML

Dokončeno

Velká část definice XAML se v době kompilace vyrovná. Často víte, kde mají být umístěny prvky, jaké barvy a písma se použijí a které hodnoty literálu mají být přiřazeny k vlastnostem.

Někdy ale potřebujete nastavit hodnotu vlastnosti na hodnotu, kterou nelze určit v době kompilace. Tyto hodnoty jsou známy pouze při spuštění programu. V těchto situacích můžete vytvořit objekt, který poskytuje hodnotu XAML za běhu. XAML podporuje rozšíření značek pro tento účel.

V této lekci se dozvíte, jak vytvářet a používat rozšíření značek.

Co je rozšíření značek?

Rozšíření značek je třída, kterou používáte v XAML pro přístup k hodnotám modulu runtime. Předpokládejme, že máte v uživatelském rozhraní XAML definovaných mnoho popisků a chcete vlastnost nastavit FontSize na stejnou hodnotu v celé aplikaci, abyste měli jistotu, že všechny styly popisků jsou konzistentní. Vlastnost můžete nastavit FontSize pomocí XAML, jak je znázorněno v následujícím příkladu:

<Label Text="Hello, World!"
            Grid.Row="0"
            SemanticProperties.HeadingLevel="Level1"
            FontSize="28"
            HorizontalOptions="CenterAndExpand"/>

Toto nastavení můžete opakovat pro každý popisek, ale co když budete chtít tuto hodnotu později změnit? Potřebujete najít každou instanci této vlastnosti a provést změnu. Předpokládejme také, že nevíte, jakou hodnotu použít; Lze ji vypočítat za běhu na základě faktorů, jako je orientace zařízení, rozlišení obrazovky nebo jiné aspekty. V těchto případech potřebujete něco sofistikovanějšího než pevně zakódovaný literál. Tady je užitečné rozšíření značek. Rozšíření značek poskytují flexibilitu v tom, jak získáte hodnotu, která se použije v XAML.

Vytvoření rozšíření značek

Rozšíření značek je třída, která implementuje rozhraní Microsoft.Maui.Controls.Xaml.IMarkupExtension . Toto rozhraní definuje jednu metodu s názvem ProvideValues následujícím podpisem:

public object ProvideValue(IServiceProvider serviceProvider)
{
    ...
}

Účelem této metody je zadat hodnotu kódu XAML. Všimněte si, že návratový typ je object, takže hodnota může být libovolného typu, pokud je vhodná pro místo, kde se používá. Například v rozšíření značek, které vypočítá a vrátí velikost písma, návratový typ by měl být double.

Parametr serviceProvider obsahuje kontextové informace o tom, kde se rozšíření značek používá v kódu XAML. Kromě jiných informací identifikuje ovládací prvek, na který se rozšíření používá.

Rozšíření FontSize značek pro vlastnost můžete zachovat jednoduché. V následujícím příkladu MainPage třída zveřejňuje double pole s názvem MyFontSize. Třída GlobalFontSizeExtension implementuje IMarkupExtension rozhraní a ProvideValue metoda vrátí hodnotu MyFontSize proměnné:

namespace MyMauiApp;

public partial class MainPage : ContentPage
{
    public const double MyFontSize = 28;

    public MainPage()
    {
        InitializeComponent();
        ...
    }
    ...
}

public class GlobalFontSizeExtension : IMarkupExtension
{
    public object ProvideValue(IServiceProvider serviceProvider)
    {
        return MainPage.MyFontSize;
    }
}

Poznámka:

Pole MyFontSize musí být static členem MainPage třídy, aby bylo možné na něj tímto způsobem odkazovat ProvideValue . Osvědčeným postupem je, že v tomto případě by proměnná měla být také konstantou. Hodnota const je static.

Metoda ProvideValue může také upravit vrácenou hodnotu v závislosti na orientaci a provedení zařízení.

Použití rozšíření značek na ovládací prvek v XAML

Pokud chcete použít rozšíření značek v kódu XAML, přidejte obor názvů obsahující GlobalFontSizeExtension třídu do seznamu oborů názvů ve ContentPage značce. V následujícím příkladu má tento obor názvů alias mycode:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:mycode="clr-namespace:MyMauiApp"
             x:Class="MyMauiApp.MainPage">

Rozšíření značek můžete použít k nastavení FontSize vlastnosti takto. Všimněte si, že konvence je, že rozšíření značek má příponu v názvu. XAML tuto příponu rozpozná a při volání rozšíření z kódu XAML ji nemusíte zahrnout. V následujícím příkladu se na GlobalFontSizeExtension třídu odkazuje jednoduše takto GlobalFontSize:

<Label Text="Hello, World!"
            Grid.Row="0"
            SemanticProperties.HeadingLevel="Level1"
            FontSize="{mycode:GlobalFontSize}"
            HorizontalOptions="CenterAndExpand"/>

Stejné rozšíření značek můžete použít v celém kódu XAML pro libovolný ovládací prvek, který potřebuje zadat velikost písma. Později, pokud se rozhodnete změnit velikost písma, stačí upravit pouze definici MyFontSize proměnné ve MainPage třídě.

StaticExtension – třída

Stejně užitečné jako GlobalFontSize rozšíření značek je nepravděpodobné, že byste takové rozšíření vytvořili. Důvod je jednoduchý. .NET MAUI už poskytuje obecnější rozšíření, které umožňuje odkazovat na libovolnou statickou hodnotu v kódu. Toto rozšíření je pojmenované StaticExtensionnebo Static zkráceně. Následující kód ukazuje základní osnovu této třídy rozšíření:

[ContentProperty ("Member")]
public class StaticExtension : IMarkupExtension
{
    public string Member {get; set;}
    public object ProvideValue (IServiceProvider serviceProvider)
    {
        ...
    }
}

Poznámka:

Účelem rozšíření vlastních značek je umožnit zpracování složitějších situací místo jednoduchého statického případu. Můžete například muset dynamicky změnit velikost písma na základě faktoru formuláře zařízení.

Chcete-li tuto třídu použít v kódu XAML, zadejte název statické proměnné, na kterou chcete odkazovat ve Member vlastnosti, a ProvideValue metoda vrátí hodnotu v této proměnné. Následující příklad ukazuje, jak ji použít:

<Label Text="Hello, World!"
            Grid.Row="0"
            SemanticProperties.HeadingLevel="Level1"
            FontSize="{x:Static Member=mycode:MainPage.MyFontSize}"
            HorizontalOptions="CenterAndExpand"/>

.NET MAUI poskytuje sadu dalších tříd rozšíření značek, které můžete použít pro scénáře, jako jsou datové vazby, odkazování na dynamické prostředky a styly a zpracování polí dat.

Kontrola znalostí

1.

Které rozšíření značek umožňuje nastavit vlastnost XAML na statickou hodnotu definovanou ve třídě kódu?

2.

Které rozhraní použijete k vytvoření vlastního rozšíření značek?