Händelsehantering i XAML
När du har skapat ditt XAML-användargränssnitt kan du lägga till kod för att svara på de interaktioner som sker när användaren besöker sidan. .NET MAUI meddelar tillämpningen av användarindata och interaktioner via standardhändelser för .NET.
I den här lektionen får du lära dig hur du hanterar dessa händelser och utför de användar förväntade åtgärderna.
Namnge element på en XAML-sida
Händelsehanteringskoden behöver ofta referera till specifika kontroller och deras egenskaper på en sida. Du kan tilldela varje kontroll ett unikt namn. Det gör du genom att använda XAML-attributet x:Name
. Attributet x:Name
gör två saker:
Det lägger till ett privat fält i den genererade kod bakom-filen som mappas till det här elementet. Använd det här fältet i koden för att interagera med det visuella elementet för att ange körningsegenskaper och hantera händelser.
Det gör elementet känt för XAML via det här namnet. Du kan referera till dessa element från andra element som definierats i samma XAML-fil.
Du kan inte använda någon godtycklig sträng när du namnger elementet. Värdet som tilldelats attributet x:Name
används för att skapa ett fält i kod. I stället måste den följa namngivningskonventionerna för en variabel. Namnet måste också vara unikt eftersom det kompileras till koden bakom definitionen.
När du har angett ett namn för ett element kan du interagera med elementet i filen bakom koden. Följande XAML-fragment definierar en Label
kontroll. Den heter CounterLabel (det här exemplet tas från standardappen som .NET MAUI-mallen genererar):
<Label Text="Current count: 0"
...
x:Name="CounterLabel"
... />
I den här sidans kod bakom kan du referera till den CounterLabel
här kontrollen via fältet och ändra dess egenskaper:
count++;
CounterLabel.Text = $"Current count: {count}";
Viktigt!
Fältet initieras inte förrän InitializeComponent
metoden för sidan körs. Den här metoden är en del av XAML-parsnings- och objekt-instansieringsprocessen. Placera all kod som interagerar med ett element som definieras i XAML efter det här anropet. Undantaget till den här regeln är ContentPage
själva klassen. Du kan komma åt alla egenskaper i klassen innan du kör InitializeComponent
metoden. Men om du anger några egenskaper för den här klassen i XAML skriver dessa egenskapsvärden över alla värden som du kan ha angett innan du InitializeComponent
kör .
Använda ett attribut för att koppla upp händelser
Många kontroller exponerar egenskaper som motsvarar de händelser som dessa kontroller kan svara på, till exempel Clicked
händelsen för en knapp. Olika kontroller stöder olika uppsättningar händelser. En kontroll kan till exempel Button
svara på , Pressed
och Released
händelser, medan en Entry
kontroll har händelser som TextChanged
.Clicked
Du kan initiera en händelseegenskap i en sidas XAML-markering och ange namnet på den metod som ska köras när händelsen utlöses. Händelsemetoden måste uppfylla följande signaturkrav:
- Det går inte att returnera ett värde. -metoden måste vara
void
. - Det måste innehålla två parametrar. en
object
referens som anger det objekt som utlöste händelsen (kallas avsändaren) och enEventArgs
parameter som innehåller argument som skickas till händelsehanteraren av avsändaren. - Händelsehanteraren ska vara
private
. Detta tillämpas inte, men om du gör en händelsehanterare offentlig blir den tillgänglig för omvärlden och en annan åtgärd än den förväntade händelsen som utlöses kan anropa den. - Händelsehanteraren kan vara
async
om den behöver köra asynkrona åtgärder.
I följande exempel visas definitionen av Clicked
händelsehanteraren för knappen i exempelappen från .NET MAUI-mallen. Metodnamnet följer en standardkonvention. På följt av namnet på kontrollen (knappen heter Counter) och namnet på händelsen (klickade). Den här konventionen tillämpas inte, men det är en bra idé:
private void OnCounterClicked(object sender, EventArgs e)
{
...
}
Avgränsning av problem
Det är praktiskt att koppla ihop händelser i XAML, men det blandar kontrollbeteendet med användargränssnittsdefinitionen. Många utvecklare föredrar att hålla dessa element åtskilda och utföra alla prenumerationer för händelsehanterare i koden bakom till namngivna element. Det är lättare att se vad som är kopplat till och var beteendet mappas. Den här metoden gör det också svårare att oavsiktligt bryta koden genom att ta bort en hanterare i XAML utan att inse det. Kompilatorn fångar inte en borttagen hanterare och det blir bara ett problem när koden inte utför det beteendet korrekt.
Om du väljer att koppla upp händelsehanterare med XAML eller med hjälp av kod är ett personligt val.
Om du vill koppla en händelsehanterare i kod använder du operatorn +=
för att prenumerera på händelsen. Du utför vanligtvis den här åtgärden i konstruktorn för sidan efter anropet till InitializeComponent
:
public partial class MainPage : ContentPage, IPage
{
public MainPage()
{
InitializeComponent();
Counter.Clicked += OnCounterClicked;
}
...
private void OnCounterClicked(object sender, EventArgs e)
{
...
}
}
Kommentar
Du kan använda den här metoden för att prenumerera på flera metoder för händelsehantering för samma händelse. Varje händelsehanteringsmetod körs när händelsen inträffar, men du bör inte anta att de körs i någon viss ordning, så introducera inga beroenden mellan dem.
På samma sätt kan du ta bort en händelsehanterare genom att avbryta prenumerationen från händelsen med operatorn -=
senare i programmet:
Counter.Clicked -= OnCounterClicked;