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:
- De instructie AddHandler met de operator AddressOf, die ook in het CLR-gebeurtenisafhandelingsmodel wordt gebruikt.
- Het verwerkt trefwoord in de definitie van de gebeurtenishandler. Zie Visual Basic- en WPF-gebeurtenisafhandelingvoor meer informatie.
- De methode UIElement.AddHandler, samen met de operator
AddressOf
voor verwijzing naar de event handler.
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.
- Hiermee voegt u een nieuwe knop met de naam
ButtonCreatedByCode
toe aan de reeds gebouwde XAML-elementstructuur. - Hiermee geeft u eigenschappen op voor de nieuwe knop, zoals de naam, inhoud en achtergrondkleur.
- Wijst de
ButtonCreatedByCode_Click
eventhandler toe aanButtonCreatedByCode
. - Wijst dezelfde
ButtonCreatedByCode_Click
gebeurtenis-handler toe aanStackPanel1
.
Wanneer op ButtonCreatedByCode
wordt geklikt:
- De Click gerouteerde gebeurtenis wordt opgeroepen op
ButtonCreatedByCode
. - De
ButtonCreatedByCode_Click
gebeurtenis-handler die is toegewezen aanButtonCreatedByCode
wordt geactiveerd. - De
Click
gerouteerde gebeurtenis beweegt zich omhoog door de elementenboom naarStackPanel1
. - De
ButtonCreatedByCode_Click
gebeurtenis-handler die is toegewezen aanStackPanel1
wordt geactiveerd. - De
Click
gerouteerde gebeurtenis gaat verder omhoog in de elementenboom, wat mogelijk andereClick
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
wordtButtonCreatedByCode
de eerste keer dat de handler wordt uitgevoerd enStackPanel1
de tweede keer. - Het RoutedEventArgs.Source-object, het element dat oorspronkelijk de gebeurtenis heeft gegenereerd. In dit voorbeeld is de
Source
altijdButtonCreatedByCode
.
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
- overzicht van gerouteerde gebeurtenissen
- XAML in WPF
.NET Desktop feedback