Rozszerzenia struktury znaczników XAML
- 10 minut
Większość definicji XAML zostanie rozliczona w czasie kompilacji. Często wiesz, gdzie należy umieścić elementy, jakie kolory i czcionki będą używane, oraz jakie wartości literału powinny być przypisane do właściwości.
Czasami jednak należy ustawić wartość właściwości na wartość, której nie można określić w czasie kompilacji. Te wartości są znane tylko wtedy, gdy program jest uruchomiony. W takich sytuacjach można utworzyć obiekt, który zapewnia wartość XAML w czasie wykonywania. W tym celu język XAML obsługuje rozszerzenia znaczników .
W tej lekcji dowiesz się, jak tworzyć rozszerzenia znaczników i używać ich.
Co to jest rozszerzenie znaczników?
Rozszerzenie znaczników to klasa używana w języku XAML do uzyskiwania dostępu do wartości środowiska uruchomieniowego. Załóżmy, że masz wiele etykiet zdefiniowanych w interfejsie użytkownika XAML i chcesz ustawić FontSize właściwość na tę samą wartość w całej aplikacji, aby upewnić się, że wszystkie style etykiet są spójne. Właściwość można ustawić FontSize przy użyciu języka XAML, jak pokazano w poniższym przykładzie:
<Label Text="Hello, World!"
Grid.Row="0"
SemanticProperties.HeadingLevel="Level1"
FontSize="28"
HorizontalOptions="CenterAndExpand"/>
To samo ustawienie można powtórzyć dla każdej etykiety, ale co zrobić, jeśli chcesz później zmienić tę wartość? Musisz znaleźć każde wystąpienie tej właściwości i wprowadzić zmianę. Załóżmy również, że nie wiesz, jakiej wartości użyć; Można je obliczyć w czasie wykonywania na podstawie czynników, takich jak orientacja urządzenia, rozdzielczość ekranu lub inne zagadnienia. W takich przypadkach potrzebujesz czegoś bardziej zaawansowanego niż zakodowany literał. Jest to miejsce, w którym przydatne jest rozszerzenie znaczników. Rozszerzenia znaczników zapewniają elastyczność uzyskiwania wartości używanej w języku XAML.
Tworzenie rozszerzenia znaczników
Rozszerzenie znaczników to klasa, która implementuje interfejs Microsoft.Maui.Controls.Xaml.IMarkupExtension. Ten interfejs definiuje jedną metodę o nazwie ProvideValue, z następującym podpisem:
public object ProvideValue(IServiceProvider serviceProvider)
{
...
}
Celem tej metody jest podanie wartości do znaczników XAML. Zwróć uwagę, że zwracany typ to object, więc wartość może być dowolnego typu, o ile jest odpowiednia dla miejsca, w którym jest używana. Na przykład w rozszerzeniu znaczników, które oblicza i zwraca rozmiar czcionki, zwracany typ powinien mieć doublewartość .
Parametr serviceProvider zawiera kontekstowe informacje o tym, gdzie rozszerzenie znaczników jest używane w kodzie XAML; między innymi informacje identyfikują kontrolkę, do której jest stosowane rozszerzenie.
Można zachować rozszerzenie znaczników dla FontSize właściwości proste. W poniższym przykładzie MainPage klasa uwidacznia double pole o nazwie MyFontSize. Klasa GlobalFontSizeExtension implementuje IMarkupExtension interfejs, a ProvideValue metoda zwraca wartość zmiennej MyFontSize :
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;
}
}
Uwaga
Pole MyFontSize musi być składową staticMainPage klasy, aby umożliwić jej przywołowanie w ProvideValue metodzie w ten sposób. Dobra praktyka oznacza, że w tym przypadku zmienna powinna być również stałą. Wartość const to static.
Metoda ProvideValue może również wprowadzić korekty zwracanej wartości, w zależności od orientacji i współczynnika formy urządzenia.
Stosowanie rozszerzenia znaczników do kontrolki w języku XAML
Aby użyć rozszerzenia znaczników w kodzie XAML, dodaj przestrzeń nazw zawierającą GlobalFontSizeExtension klasę do listy przestrzeni nazw w tagu ContentPage . W poniższym przykładzie ta przestrzeń nazw ma podany 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">
Możesz użyć rozszerzenia znaczników, aby ustawić FontSize właściwość w następujący sposób. Pamiętaj, że konwencja polega na tym, że rozszerzenie znaczników ma sufiks Extension w nazwie. Kod XAML rozpoznaje ten sufiks i nie trzeba go dołączać podczas wywoływania rozszerzenia z kodu XAML. W poniższym przykładzie GlobalFontSizeExtension klasa jest przywołyowana po prostu jako GlobalFontSize:
<Label Text="Hello, World!"
Grid.Row="0"
SemanticProperties.HeadingLevel="Level1"
FontSize="{mycode:GlobalFontSize}"
HorizontalOptions="CenterAndExpand"/>
Możesz zastosować to samo rozszerzenie znaczników w całym kodzie XAML dla dowolnej kontrolki, która musi określić rozmiar czcionki. Później, jeśli zdecydujesz się zmienić rozmiar czcionki, musisz zmodyfikować tylko definicję MyFontSize zmiennej MainPage w klasie.
Klasa StaticExtension
Ponieważ rozszerzenie znaczników jest przydatne GlobalFontSize , jest mało prawdopodobne, aby utworzyć takie rozszerzenie. Przyczyna tego jest prosta. Program .NET MAUI udostępnia już bardziej uogólnione rozszerzenie, które umożliwia odwołowanie się do dowolnej wartości statycznej w kodzie. To rozszerzenie ma nazwę StaticExtension, lub Static na krótko. Poniższy kod przedstawia podstawowy konspekt tej klasy rozszerzenia:
[ContentProperty ("Member")]
public class StaticExtension : IMarkupExtension
{
public string Member {get; set;}
public object ProvideValue (IServiceProvider serviceProvider)
{
...
}
}
Uwaga
Celem niestandardowych rozszerzeń znaczników jest umożliwienie obsługi bardziej złożonych sytuacji, a nie prostego przypadku statycznego. Na przykład może być konieczne dynamiczne zmienianie rozmiaru czcionki na podstawie współczynnika formularza urządzenia.
Aby użyć tej klasy w kodzie XAML, podaj nazwę zmiennej statycznej, do której chcesz się odwołać we Member właściwości, a ProvideValue metoda zwraca wartość w tej zmiennej. W poniższym przykładzie pokazano, jak go używać:
<Label Text="Hello, World!"
Grid.Row="0"
SemanticProperties.HeadingLevel="Level1"
FontSize="{x:Static Member=mycode:MainPage.MyFontSize}"
HorizontalOptions="CenterAndExpand"/>
Program .NET MAUI udostępnia zestaw innych klas rozszerzeń znaczników, których można używać w scenariuszach, takich jak powiązanie danych, odwoływanie się do zasobów dynamicznych i stylów oraz obsługa tablic danych.