XAML-markeringsextensies
Veel van uw XAML-definitie wordt tijdens het compileren geregeld. Vaak weet u waar elementen moeten worden weergegeven, welke kleuren en lettertypen worden gebruikt en welke letterlijke waarden moeten worden toegewezen aan eigenschappen.
Soms moet u echter een eigenschapswaarde instellen op een waarde die niet kan worden bepaald tijdens het compileren. Deze waarden zijn alleen bekend wanneer het programma wordt uitgevoerd. In deze situaties kunt u een object maken dat tijdens runtime een waarde aan XAML biedt. XAML biedt ondersteuning voor Markup Extensions voor dit doel.
In deze les leert u hoe u markeringsextensies maakt en gebruikt.
Wat is een markeringsextensie?
Een markeringsextensie is een klasse die u in XAML gebruikt voor toegang tot runtime-waarden. Stel dat er veel labels zijn gedefinieerd in uw XAML-gebruikersinterface en dat u de FontSize
eigenschap wilt instellen op dezelfde waarde in de app om ervoor te zorgen dat alle labelstijl consistent is. U kunt de FontSize
eigenschap instellen met XAML, zoals wordt weergegeven in het volgende voorbeeld:
<Label Text="Hello, World!"
Grid.Row="0"
SemanticProperties.HeadingLevel="Level1"
FontSize="28"
HorizontalOptions="CenterAndExpand"/>
U kunt dezelfde instelling voor elk label herhalen, maar wat als u deze waarde later wilt wijzigen? U moet elk exemplaar van deze eigenschap vinden en de wijziging aanbrengen. Stel dat u niet weet welke waarde u moet gebruiken; het kan tijdens runtime worden berekend op basis van factoren zoals apparaatstand, schermresolutie of andere overwegingen. In deze gevallen hebt u iets geavanceerder nodig dan een letterlijke letterlijke code. Hier is een markeringsextensie handig. Markeringsextensies bieden u flexibiliteit bij het verkrijgen van een waarde die wordt gebruikt in XAML.
Een markeringsextensie maken
Een markeringsextensie is een klasse die de interface Microsoft.Maui.Controls.Xaml.IMarkupExtension implementeert. Deze interface definieert één methode met de naam ProvideValue
, met de volgende handtekening:
public object ProvideValue(IServiceProvider serviceProvider)
{
...
}
Het doel van deze methode is om een waarde op te geven voor uw XAML-opmaak. U ziet dat het retourtype is object
, zodat de waarde van elk type kan zijn zolang deze geschikt is voor de plaats waar het wordt gebruikt. In een markeringsextensie die bijvoorbeeld een tekengrootte berekent en retourneert, moet het retourtype een double
zijn.
De serviceProvider
parameter bevat contextuele informatie over waar de markeringsextensie wordt gebruikt in uw XAML-code. Onder andere informatie wordt het besturingselement geïdentificeerd waarop de extensie wordt toegepast.
U kunt de markeringsextensie voor de FontSize
eigenschap eenvoudig houden. In het volgende voorbeeld wordt in de klasse een double
veld met de MainPage
naam MyFontSize
weergegeven. De GlobalFontSizeExtension
klasse implementeert de IMarkupExtension
interface en de ProvideValue
methode retourneert de waarde van MyFontSize
de variabele:
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;
}
}
Notitie
Het MyFontSize
veld moet lid static
zijn van de MainPage
klasse, zodat er op deze manier naar kan worden verwezen in de ProvideValue
methode. Een goede gewoonte impliceert dat de variabele in dit geval ook een constante moet zijn. Een const
waarde is static
.
De ProvideValue
methode kan ook wijzigingen aanbrengen in de geretourneerde waarde, afhankelijk van de afdrukstand en de formulierfactor van het apparaat.
De markeringsextensie toepassen op een besturingselement in XAML
Als u de markeringsextensie in uw XAML-code wilt gebruiken, voegt u de naamruimte met de GlobalFontSizeExtension
klasse toe aan de lijst met naamruimten in de ContentPage
tag. In het volgende voorbeeld krijgt deze naamruimte de 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">
U kunt de markeringsextensie gebruiken om de FontSize
eigenschap als volgt in te stellen. Houd er rekening mee dat een markeringsextensie de extensie voor achtervoegsels in de naam heeft. XAML herkent dit achtervoegsel en u hoeft dit niet op te nemen wanneer u de extensie aanroept vanuit uw XAML-code. In het volgende voorbeeld wordt naar de GlobalFontSizeExtension
klasse verwezen als GlobalFontSize
:
<Label Text="Hello, World!"
Grid.Row="0"
SemanticProperties.HeadingLevel="Level1"
FontSize="{mycode:GlobalFontSize}"
HorizontalOptions="CenterAndExpand"/>
U kunt dezelfde markeringsextensie toepassen in uw XAML-code voor elk besturingselement dat de tekengrootte moet opgeven. Als u later besluit de tekengrootte te wijzigen, hoeft u alleen de definitie van de MyFontSize
variabele in de MainPage
klasse te wijzigen.
De klasse StaticExtension
Het is onwaarschijnlijk dat u een dergelijke extensie maakt, net als de GlobalFontSize
extensie voor markeringen. De reden hiervoor is eenvoudig; .NET MAUI biedt al een meer gegeneraliseerde extensie waarmee u naar een statische waarde in uw code kunt verwijzen. Deze extensie heeft de naam StaticExtension
, of Static
kortom. De volgende code toont het basisoverzicht van deze extensieklasse:
[ContentProperty ("Member")]
public class StaticExtension : IMarkupExtension
{
public string Member {get; set;}
public object ProvideValue (IServiceProvider serviceProvider)
{
...
}
}
Notitie
Het doel van aangepaste markeringsextensies is om u in staat te stellen complexere situaties af te handelen in plaats van de eenvoudige statische case. U moet bijvoorbeeld mogelijk de tekengrootte dynamisch wijzigen op basis van de formulierfactor van het apparaat.
Als u deze klasse wilt gebruiken in uw XAML-code, geeft u de naam op van de statische variabele waarnaar u in de Member
eigenschap wilt verwijzen en retourneert de ProvideValue
methode de waarde in deze variabele. In het volgende voorbeeld ziet u hoe u dit kunt gebruiken:
<Label Text="Hello, World!"
Grid.Row="0"
SemanticProperties.HeadingLevel="Level1"
FontSize="{x:Static Member=mycode:MainPage.MyFontSize}"
HorizontalOptions="CenterAndExpand"/>
.NET MAUI biedt een reeks andere opmaakuitbreidingsklassen, die u kunt gebruiken voor scenario's zoals gegevensbinding, verwijzingen naar dynamische resources en stijlen, en het verwerken van matrices met gegevens.