Gebeurtenisafhandeling in XAML

Voltooid

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 InitializeComponentdeze 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, Presseden 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 een EventArgs 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;

Kenniscontrole

1.

Wat zijn de parameters die worden doorgegeven aan een methode voor gebeurtenisafhandeling?

2.

Welke operator kunt u gebruiken om een gebeurtenis-handler te koppelen aan een gebeurtenis in C#?