Rozšíření značek XAML
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 ProvideValue
s 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é StaticExtension
nebo 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.