XAML-tillägg
Mycket av din XAML-definition kommer att lösas vid kompileringstillfället. Du vet ofta var element ska placeras, vilka färger och teckensnitt som ska användas och vilka literalvärden som ska tilldelas till egenskaper.
Ibland måste du dock ange ett egenskapsvärde till ett värde som inte kan fastställas vid kompileringstillfället. Dessa värden är bara kända när programmet körs. I dessa situationer kan du skapa ett objekt som ger ett värde till XAML vid körning. XAML stöder Markup-tillägg för detta ändamål.
I den här lektionen får du lära dig hur du skapar och använder tillägg för markering.
Vad är ett tillägg för pålägg?
Ett markeringstillägg är en klass som du använder i XAML för att komma åt körningsvärden. Anta att du har många etiketter som definierats i XAML-användargränssnittet och att du vill ange FontSize
egenskapen till samma värde i hela appen för att säkerställa att all etikettformatering är konsekvent. Du kan ange egenskapen FontSize
med XAML enligt följande exempel:
<Label Text="Hello, World!"
Grid.Row="0"
SemanticProperties.HeadingLevel="Level1"
FontSize="28"
HorizontalOptions="CenterAndExpand"/>
Du kan upprepa samma inställning för varje etikett, men vad händer om du vill ändra det här värdet senare? Du behöver hitta varje instans av den här egenskapen och göra ändringen. Anta också att du inte vet vilket värde du ska använda. Det kan beräknas vid körning baserat på faktorer som enhetsorientering, skärmupplösning eller andra överväganden. I dessa fall behöver du något mer avancerat än en hårdkodad literal. Det är här ett tillägg för markering är användbart. Markeringstillägg ger dig flexibilitet i hur du får ett värde som används i XAML.
Skapa ett tillägg för markering
Ett tillägg för markering är en klass som implementerar gränssnittet Microsoft.Maui.Controls.Xaml.IMarkupExtension . Det här gränssnittet definierar en metod med namnet ProvideValue
, med följande signatur:
public object ProvideValue(IServiceProvider serviceProvider)
{
...
}
Den här metodens syfte är att ange ett värde till din XAML-markering. Observera att returtypen är object
, så värdet kan vara av vilken typ som helst så länge det är lämpligt för den plats där det används. I ett påläggstillägg som beräknar och returnerar en teckenstorlek ska returtypen till exempel vara .double
Parametern serviceProvider
innehåller kontextuell information om var påläggstillägget används i din XAML-kod. Den identifierar bland annat den kontroll som tillägget tillämpas på.
Du kan hålla markeringstillägget FontSize
för egenskapen enkelt. I följande exempel MainPage
exponerar klassen ett double
fält med namnet MyFontSize
. Klassen GlobalFontSizeExtension
implementerar IMarkupExtension
gränssnittet och ProvideValue
metoden returnerar värdet för MyFontSize
variabeln:
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;
}
}
Kommentar
Fältet MyFontSize
måste vara medlem static
MainPage
i klassen för att det ska kunna refereras till i ProvideValue
metoden på det här sättet. God praxis innebär att variabeln i det här fallet också bör vara en konstant. Ett const
värde är static
.
Metoden ProvideValue
kan också göra justeringar i det returnerade värdet, beroende på orienterings- och enhetsformulärfaktorn.
Tillämpa markeringstillägget på en kontroll i XAML
Om du vill använda markeringstillägget i XAML-koden lägger du till namnområdet som innehåller GlobalFontSizeExtension
klassen i listan över namnområden i taggen ContentPage
. I följande exempel får det här namnområdet 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">
Du kan använda markeringstillägget för att ange egenskapen FontSize
så här. Observera att ett markeringstillägg har suffixtillägget i sitt namn. XAML känner igen det här suffixet och du behöver inte inkludera det när du anropar tillägget från XAML-koden. I följande exempel GlobalFontSizeExtension
refereras klassen helt enkelt till GlobalFontSize
:
<Label Text="Hello, World!"
Grid.Row="0"
SemanticProperties.HeadingLevel="Level1"
FontSize="{mycode:GlobalFontSize}"
HorizontalOptions="CenterAndExpand"/>
Du kan använda samma markeringstillägg i XAML-koden för alla kontroller som behöver ange teckenstorleken. Om du senare bestämmer dig för att ändra teckenstorleken behöver du bara ändra definitionen av variabeln MyFontSize
MainPage
i klassen.
Klassen StaticExtension
Så användbart som markeringstillägget GlobalFontSize
är är det osannolikt att du skulle skapa ett sådant tillägg. Anledningen till detta är enkel. .NET MAUI innehåller redan ett mer generaliserat tillägg som gör att du kan referera till eventuella statiska värden i koden. Det här tillägget heter StaticExtension
, eller Static
för kort. Följande kod visar den här tilläggsklassens grundläggande disposition:
[ContentProperty ("Member")]
public class StaticExtension : IMarkupExtension
{
public string Member {get; set;}
public object ProvideValue (IServiceProvider serviceProvider)
{
...
}
}
Kommentar
Syftet med anpassade tillägg för markering är att du ska kunna hantera mer komplexa situationer i stället för det enkla statiska fallet. Du kan till exempel behöva ändra teckenstorleken dynamiskt baserat på enhetens formulärfaktor.
Om du vill använda den här klassen i XAML-koden anger du namnet på den statiska variabel som du vill referera till i Member
egenskapen och ProvideValue
metoden returnerar värdet i den här variabeln. I följande exempel visas hur du använder det:
<Label Text="Hello, World!"
Grid.Row="0"
SemanticProperties.HeadingLevel="Level1"
FontSize="{x:Static Member=mycode:MainPage.MyFontSize}"
HorizontalOptions="CenterAndExpand"/>
.NET MAUI innehåller en uppsättning andra markeringstilläggsklasser som du kan använda för scenarier som databindning, referera till dynamiska resurser och formatmallar och hantera datamatriser.