Hændelseshåndtering i XAML
- 5 minutter
Når du har oprettet din XAML-brugergrænseflade, kan du tilføje kode for at reagere på de interaktioner, der opstår, når brugeren besøger siden. .NET MAUI giver besked om anvendelse af brugerinput og interaktioner via almindelige .NET-hændelser.
I dette undermodul lærer du, hvordan du håndterer disse hændelser og udfører de handlinger, der forventes af brugeren.
Navngivning af elementer på en XAML-side
Kode til hændelseshåndtering skal ofte referere til bestemte kontrolelementer og deres egenskaber på en side. Du kan tildele hvert kontrolelement et entydigt navn. Det gør du ved at bruge XAML-attributten x:Name. Attributten x:Name gør to ting:
Det føjer et privat felt til den genererede kode bag fil, der er knyttet til dette element. Brug dette felt i din kode til at interagere med visualiseringselementet for at angive kørselsegenskaber og til at håndtere hændelser.
Det gør elementet kendt for XAML via dette navn. Du kan referere til disse elementer fra andre elementer, der er defineret i den samme XAML-fil.
Du kan ikke bruge nogen vilkårlig streng, når du navngiver elementet. Den værdi, der er tildelt attributten x:Name, bruges til at oprette et felt i kode. Den skal i stedet overholde navngivningskonventionerne for en variabel. Navnet skal også være entydigt, fordi det er kompileret i definitionen bag koden.
Når du har angivet et navn for et element, kan du interagere med det pågældende element i filen bag koden. Følgende XAML-fragment definerer et Label-kontrolelement. Det hedder CounterLabel (dette eksempel er taget fra standardappen, som .NET MAUI-skabelonen genererer):
<Label Text="Current count: 0"
...
x:Name="CounterLabel"
... />
I denne sides bagside kan du referere til dette kontrolelement via feltet CounterLabel og ændre dets egenskaber:
count++;
CounterLabel.Text = $"Current count: {count}";
Vigtig
Feltet initialiseres ikke, før sidens InitializeComponent-metode køres. Denne metode er en del af XAML-fortolknings- og objekt instantieringsprocessen. Placer kode, der interagerer med et element, der er defineret i XAML efter dette kald. Undtagelsen til denne regel er selve klassen ContentPage. Du kan få adgang til alle egenskaber i klassen, før du udfører metoden InitializeComponent. Men hvis du angiver nogen egenskaber for denne klasse i XAML, overskriver disse egenskabsværdier de værdier, du har angivet, før du udfører InitializeComponent.
Brug en attribut til at oprette forbindelse til hændelser
Mange kontrolelementer viser egenskaber, der svarer til de hændelser, som disse kontrolelementer kan reagere på, f.eks. den Clicked hændelse for en knap. Forskellige kontrolelementer understøtter forskellige sæt hændelser. Et Button kontrolelement kan f.eks. reagere på hændelserne Clicked, Pressedog Released , mens et Entry-kontrolelement indeholder hændelser som f.eks. TextChanged. Du kan initialisere en hændelsesegenskab i en sides XAML-markering og angive navnet på den metode, der skal køres, når hændelsen udløses. Hændelsesmetoden skal opfylde følgende signaturkrav:
- Den kan ikke returnere en værdi. metoden skal være
void. - Det skal tage to parametre. en
objectreference, der angiver det objekt, der udløste hændelsen (kendt som den afsender), og enEventArgsparameter, der indeholder argumenter, der overføres til hændelseshandleren af afsenderen. - Hændelseshandleren skal være
private. Dette gennemtvinges ikke, men hvis du gør en hændelseshandler offentlig, bliver den tilgængelig for omverdenen, og en anden handling end den forventede hændelse, der udløses, kan aktivere den. - Hændelseshandleren kan
async, hvis den skal køre asynkrone handlinger.
I følgende eksempel vises definitionen af Clicked hændelseshandler for knappen i eksempelappen fra .NET MAUI-skabelonen. Metodenavnet følger en standardkonvention. På efterfulgt af navnet på kontrolelementet (knappen hedder Counter) og navnet på hændelsen (Klikket). Denne konvention gennemtvinges ikke, men er god praksis:
private void OnCounterClicked(object sender, EventArgs e)
{
...
}
Adskillelse af bekymringer
Det er praktisk at oprette forbindelse til hændelser i XAML, men den blander kontrolelementets funktionsmåde med definitionen af brugergrænsefladen. Mange udviklere foretrækker at bevare disse elementer adskilte og udføre alle hændelseshandlerabonnementer i den bagvedliggende kode til navngivne elementer. Det er nemmere at se, hvad der er tilsluttet, og hvor funktionsmåden er tilknyttet. Denne metode gør det også sværere at bryde koden ved at fjerne en handler i XAML uden at indse det. Compileren registrerer ikke en fjernet handler, og det bliver kun et problem, når koden ikke fungerer korrekt.
Uanset om du vælger at oprette forbindelse til hændelseshandlere ved hjælp af XAML eller ved hjælp af kode, er det et spørgsmål om personligt valg.
Hvis du vil oprette forbindelse til en hændelseshandler i kode, skal du bruge operatoren += til at abonnere på hændelsen. Du udfører typisk denne handling i konstruktøren for siden efter kaldet til InitializeComponent:
public partial class MainPage : ContentPage, IPage
{
public MainPage()
{
InitializeComponent();
Counter.Clicked += OnCounterClicked;
}
...
private void OnCounterClicked(object sender, EventArgs e)
{
...
}
}
Seddel
Du kan bruge denne fremgangsmåde til at abonnere på flere metoder til håndtering af hændelser for den samme hændelse. Hver hændelseshåndteringsmetode kører, når hændelsen indtræffer, selvom du ikke skal antage, at de udføres i en bestemt rækkefølge, så du skal ikke introducere nogen afhængigheder mellem dem.
På samme måde kan du fjerne en hændelseshandler ved at opsige abonnementet fra hændelsen med operatoren -= senere i dit program:
Counter.Clicked -= OnCounterClicked;