Gebeurtenisafhandeling in XAML
Nadat u de XAML-gebruikersinterface hebt gemaakt, kunt u code toevoegen om te reageren op de interacties die optreden wanneer de gebruiker de pagina bezoekt. .NET MAUI meldt de toepassing van gebruikersinvoer en interacties via standaard .NET-gebeurtenissen.
In deze les leert u hoe u deze gebeurtenissen kunt afhandelen en hoe u de door de gebruiker verwachte bewerkingen uitvoert.
Naamgevingselementen op een XAML-pagina
Code voor gebeurtenisafhandeling moet vaak verwijzen naar specifieke besturingselementen en de bijbehorende eigenschappen op een pagina. U kunt een unieke naam toewijzen aan elk besturingselement. Gebruik hiervoor het XAML-kenmerk x:Name
. Het x:Name
kenmerk doet twee dingen:
Er wordt een privéveld toegevoegd aan het gegenereerde code-behind-bestand dat is toegewezen aan dit element. Gebruik dit veld in uw code om te communiceren met het visuele element om runtime-eigenschappen in te stellen en gebeurtenissen te verwerken.
Het maakt het element bekend bij XAML via deze naam. U kunt naar deze elementen verwijzen uit andere elementen die zijn gedefinieerd in hetzelfde XAML-bestand.
U kunt geen willekeurige tekenreeks gebruiken wanneer u het element een naam geeft. De waarde die aan het x:Name
kenmerk is toegewezen, wordt gebruikt om een veld in code te maken. In plaats daarvan moet deze voldoen aan de naamconventies voor een variabele. De naam moet ook uniek zijn, omdat deze is gecompileerd in de definitie van de code-behind.
Nadat u een naam voor een element hebt opgegeven, kunt u dit element gebruiken in het bestand code-behind. Het volgende XAML-fragment definieert een Label
besturingselement. Het heet CounterLabel (dit voorbeeld is afkomstig van de standaard-app die door de .NET MAUI-sjabloon wordt gegenereerd):
<Label Text="Current count: 0"
...
x:Name="CounterLabel"
... />
In de codeachter van deze pagina kunt u naar dit besturingselement verwijzen via het veld en de CounterLabel
eigenschappen ervan wijzigen:
count++;
CounterLabel.Text = $"Current count: {count}";
Belangrijk
Het veld wordt pas geïnitialiseerd als de InitializeComponent
methode van de pagina wordt uitgevoerd. Deze methode maakt deel uit van het XAML-parserings- en object-instantiatieproces. Plaats na deze aanroep code die communiceert met een element dat is gedefinieerd in XAML. De uitzondering op deze regel is de ContentPage
klasse zelf. U hebt toegang tot alle eigenschappen in de klasse voordat u de InitializeComponent
methode uitvoert. Als u echter eigenschappen instelt voor deze klasse in XAML, overschrijven deze eigenschapswaarden alle waarden die u mogelijk hebt ingesteld voordat u InitializeComponent
deze uitvoert.
Een kenmerk gebruiken om gebeurtenissen vast te leggen
Veel besturingselementen bevatten eigenschappen die overeenkomen met de gebeurtenissen waarop deze besturingselementen kunnen reageren, zoals de Clicked
gebeurtenis voor een knop. Verschillende besturingselementen ondersteunen verschillende sets gebeurtenissen. Een besturingselement kan bijvoorbeeld Button
reageren op Clicked
, Pressed
en Released
gebeurtenissen, terwijl een Entry
besturingselement gebeurtenissen heeft zoals TextChanged
. U kunt een gebeurteniseigenschap initialiseren in de XAML-markeringen van een pagina en de naam opgeven van de methode die moet worden uitgevoerd wanneer de gebeurtenis wordt geactiveerd. De gebeurtenismethode moet voldoen aan de volgende handtekeningvereisten:
- Er kan geen waarde worden geretourneerd. de methode moet zijn
void
. - Het moet twee parameters bevatten; een
object
verwijzing die het object aangeeft dat de gebeurtenis heeft geactiveerd (ook wel de afzender genoemd) en eenEventArgs
parameter die argumenten bevat die door de afzender worden doorgegeven aan de gebeurtenis-handler. - De gebeurtenis-handler moet zijn
private
. Dit wordt niet afgedwongen, maar als u een gebeurtenis-handler openbaar maakt, wordt deze toegankelijk voor de buitenwereld en kan een andere actie dan de verwachte gebeurtenis die wordt geactiveerd, deze aanroepen. - De gebeurtenis-handler kan zijn
async
als deze asynchrone bewerkingen moet uitvoeren.
In het volgende voorbeeld ziet u de definitie van de Clicked
gebeurtenis-handler voor de knop in de voorbeeld-app van de .NET MAUI-sjabloon. De methodenaam volgt een standaardconventie; Gevolgd door de naam van het besturingselement (de knop heet Teller) en de naam van de gebeurtenis (erop geklikt). Deze conventie wordt niet afgedwongen, maar is een goede gewoonte:
private void OnCounterClicked(object sender, EventArgs e)
{
...
}
Scheiding van problemen
Het bedraden van gebeurtenissen in XAML is handig, maar het combineert het besturingsgedrag met de definitie van de gebruikersinterface. Veel ontwikkelaars houden deze elementen liever uniek en doen alle gebeurtenis-handlerabonnementen in de code-achter op benoemde elementen. Het is gemakkelijker om te zien wat er is gekoppeld en waar het gedrag is toegewezen. Deze methode maakt het ook moeilijker om de code per ongeluk te verbreken door een handler in de XAML te verwijderen zonder deze te realiseren. De compiler ondervangt geen verwijderde handler en wordt alleen een probleem wanneer de code dat gedrag niet goed uitvoert.
Of u ervoor kiest om gebeurtenis-handlers te koppelen met behulp van XAML of door code te gebruiken, is een kwestie van persoonlijke keuze.
Als u een gebeurtenis-handler in code wilt koppelen, gebruikt u de +=
operator om u te abonneren op de gebeurtenis. Normaal gesproken voert u deze bewerking uit in de constructor voor de pagina, na de aanroep naar InitializeComponent
:
public partial class MainPage : ContentPage, IPage
{
public MainPage()
{
InitializeComponent();
Counter.Clicked += OnCounterClicked;
}
...
private void OnCounterClicked(object sender, EventArgs e)
{
...
}
}
Notitie
U kunt deze methode gebruiken om u te abonneren op meerdere methoden voor gebeurtenisafhandeling voor dezelfde gebeurtenis. Elke methode voor het afhandelen van gebeurtenissen wordt uitgevoerd wanneer de gebeurtenis plaatsvindt, hoewel u er niet van uitgaat dat ze in een bepaalde volgorde worden uitgevoerd, dus introduceer geen afhankelijkheden tussen deze methoden.
Op dezelfde manier kunt u een gebeurtenis-handler verwijderen door deze uit de gebeurtenis af te melden met de -=
operator verderop in uw toepassing:
Counter.Clicked -= OnCounterClicked;