Rozszerzenia struktury znaczników XAML
- 10 min
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.
Test wiedzy
Opinia
Czy ta strona była pomocna?
Nie
Potrzebujesz pomocy dotyczącej tego tematu?
Chcesz spróbować użyć asystenta Ask Learn, aby wyjaśnić ten temat lub uzyskać instrukcje, które go dotyczą?