XAML-markeringsextensies

Voltooid

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 doublezijn.

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 MyFontSizeweergegeven. 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.

Kenniscontrole

1.

Met welke markeringsextensie kunt u een XAML-eigenschap instellen op een statische waarde die is gedefinieerd in een code-behind-klasse?

2.

Welke interface gebruikt u om een aangepaste markeringsextensie te maken?