Delen via


Een gebeurtenis-handler toevoegen met behulp van code (WPF .NET)

U kunt een gebeurtenishandler toewijzen aan een element in Windows Presentation Foundation (WPF) met behulp van markeringen of code-behind. Hoewel het gebruikelijk is om een gebeurtenishandler toe te wijzen in Extensible Application Markup Language (XAML), moet u soms een gebeurtenis-handler toewijzen in code-behind. Gebruik bijvoorbeeld code wanneer:

  • Je wijst een gebeurtenishandler toe aan een element nadat de markeringspagina die het element bevat is geladen.
  • U voegt een element toe en wijst de event handler toe nadat de markeringspagina die het element bevat is geladen.
  • U definieert de elementstructuur voor uw toepassing volledig in code.

Voorwaarden

In het artikel wordt ervan uitgegaan dat u basiskennis hebt van gerouteerde gebeurtenissen en dat u overzicht van gerouteerde gebeurtenissen hebt gelezen. Als u de voorbeelden in dit artikel wilt volgen, helpt dit als u bekend bent met Extensible Application Markup Language (XAML) en weet hoe u WPF-toepassingen (Windows Presentation Foundation) schrijft.

Syntaxis voor gebeurtenishandlertoewijzing

C# ondersteunt toewijzing van gebeurtenis-handler met behulp van:

  • De +=-operator, die ook wordt gebruikt in het COMMON LANGUAGE Runtime-gebeurtenisafhandelingsmodel (CLR).
  • De methode UIElement.AddHandler.

VB ondersteunt toewijzing van gebeurtenishandler door:

Voorbeeld

In het volgende voorbeeld wordt de XAML-syntaxis gebruikt om een Button genaamd ButtonCreatedByXaml te definiëren en de ButtonCreatedByXaml_Click-methode toe te wijzen als de Click-eventhandler. Click is een ingebouwde routed event voor knoppen die zijn afgeleid van ButtonBase.

<StackPanel Name="StackPanel1">
    <Button
        Name="ButtonCreatedByXaml" 
        Click="ButtonCreatedByXaml_Click"
        Content="Create a new button with an event handler"
        Background="LightGray">
    </Button>
</StackPanel>

In het voorbeeld wordt code-behind gebruikt om de ButtonCreatedByXaml_Click- en ButtonCreatedByCode_Click-handlers te implementeren en de ButtonCreatedByCode_Click handler toe te wijzen aan de ButtonCreatedByCode- en StackPanel1-elementen. Methoden voor gebeurtenis-handlers kunnen alleen worden geïmplementeerd in code-behind.

// The click event handler for the existing button 'ButtonCreatedByXaml'.
private void ButtonCreatedByXaml_Click(object sender, RoutedEventArgs e)
{
    // Create a new button.
    Button ButtonCreatedByCode = new();

    // Specify button properties.
    ButtonCreatedByCode.Name = "ButtonCreatedByCode";
    ButtonCreatedByCode.Content = "New button and event handler created in code";
    ButtonCreatedByCode.Background = Brushes.Yellow;

    // Add the new button to the StackPanel.
    StackPanel1.Children.Add(ButtonCreatedByCode);

    // Assign an event handler to the new button using the '+=' operator.
    ButtonCreatedByCode.Click += new RoutedEventHandler(ButtonCreatedByCode_Click);

    // Assign an event handler to the new button using the AddHandler method.
    // AddHandler(ButtonBase.ClickEvent, new RoutedEventHandler(ButtonCreatedByCode_Click);

    // Assign an event handler to the StackPanel using the AddHandler method.
    StackPanel1.AddHandler(ButtonBase.ClickEvent, new RoutedEventHandler(ButtonCreatedByCode_Click));
}

// The Click event handler for the new button 'ButtonCreatedByCode'.
private void ButtonCreatedByCode_Click(object sender, RoutedEventArgs e)
{
    string sourceName = ((FrameworkElement)e.Source).Name;
    string senderName = ((FrameworkElement)sender).Name;

    Debug.WriteLine($"Routed event handler attached to {senderName}, " +
        $"triggered by the Click routed event raised by {sourceName}.");
}
' The click event handler for the existing button 'ButtonCreatedByXaml'.
Private Sub ButtonCreatedByXaml_Click(sender As Object, e As RoutedEventArgs)

    ' Create a new button and specify button properties.
    Dim ButtonCreatedByCode As New Button With {
        .Name = "ButtonCreatedByCode",
        .Content = "New button and event handler created in code",
        .Background = Brushes.Yellow
    }

    ' Add the new button to the StackPanel.
    StackPanel1.Children.Add(ButtonCreatedByCode)

    ' Assign an event handler to the new button using the AddHandler statement.
    AddHandler ButtonCreatedByCode.Click, AddressOf ButtonCreatedByCode_Click

    ' Assign an event handler to the new button using the AddHandler method.
    ' ButtonCreatedByCode.AddHandler(ButtonBase.ClickEvent, New RoutedEventHandler(AddressOf ButtonCreatedByCode_Click))

    ' Assign an event handler to the StackPanel using the AddHandler method.
    StackPanel1.AddHandler(ButtonBase.ClickEvent, New RoutedEventHandler(AddressOf ButtonCreatedByCode_Click))

End Sub

' The Click event handler for the new button 'ButtonCreatedByCode'.
Private Sub ButtonCreatedByCode_Click(sender As Object, e As RoutedEventArgs)

    Dim sourceName As String = CType(e.Source, FrameworkElement).Name
    Dim senderName As String = CType(sender, FrameworkElement).Name

    Debug.WriteLine($"Routed event handler attached to {senderName}, " +
        $"triggered by the Click routed event raised by {sourceName}.")

End Sub

Wanneer ButtonCreatedByXaml wordt aangeklikt en zijn eventhandler wordt uitgevoerd, gebeurt ButtonCreatedByXaml_Click programmatisch.

  1. Hiermee voegt u een nieuwe knop met de naam ButtonCreatedByCode toe aan de reeds gebouwde XAML-elementstructuur.
  2. Hiermee geeft u eigenschappen op voor de nieuwe knop, zoals de naam, inhoud en achtergrondkleur.
  3. Wijst de ButtonCreatedByCode_Click eventhandler toe aan ButtonCreatedByCode.
  4. Wijst dezelfde ButtonCreatedByCode_Click gebeurtenis-handler toe aan StackPanel1.

Wanneer op ButtonCreatedByCode wordt geklikt:

  1. De Click gerouteerde gebeurtenis wordt opgeroepen op ButtonCreatedByCode.
  2. De ButtonCreatedByCode_Click gebeurtenis-handler die is toegewezen aan ButtonCreatedByCode wordt geactiveerd.
  3. De Click gerouteerde gebeurtenis beweegt zich omhoog door de elementenboom naar StackPanel1.
  4. De ButtonCreatedByCode_Click gebeurtenis-handler die is toegewezen aan StackPanel1 wordt geactiveerd.
  5. De Click gerouteerde gebeurtenis gaat verder omhoog in de elementenboom, wat mogelijk andere Click gebeurtenishandlers activeert die zijn toegewezen aan andere doorgelopen elementen.

De ButtonCreatedByCode_Click gebeurtenis-handler verkrijgt de volgende informatie over de gebeurtenis die deze heeft geactiveerd:

  • Het afzenderobject, het element waaraan de eventhandler is toegewezen. De sender wordt ButtonCreatedByCode de eerste keer dat de handler wordt uitgevoerd en StackPanel1 de tweede keer.
  • Het RoutedEventArgs.Source-object, het element dat oorspronkelijk de gebeurtenis heeft gegenereerd. In dit voorbeeld is de Source altijd ButtonCreatedByCode.

Notitie

Een belangrijk verschil tussen een gerouteerde gebeurtenis en een CLR-gebeurtenis is dat een gerouteerde gebeurtenis de elementstructuur doorkruist, op zoek naar handlers, terwijl een CLR-gebeurtenis niet de elementstructuur doorkruist en handlers alleen kunnen worden gekoppeld aan het bronobject dat de gebeurtenis heeft gegenereerd. Als gevolg hiervan kan een gerouteerde gebeurtenis sender elk doorkruist element in de elementstructuur zijn.

Zie Een aangepaste gerouteerde gebeurtenis maken en Een gerouteerde gebeurtenisverwerken voor meer informatie over het maken en verwerken van gerouteerde gebeurtenissen.

Zie ook