Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Sie können einem Element in Windows Presentation Foundation (WPF) mithilfe von Markup oder CodeBehind einen Ereignishandler zuweisen. Obwohl es üblich ist, einen Ereignishandler in Extensible Application Markup Language (XAML) zuzuweisen, müssen Sie möglicherweise einen Ereignishandler in CodeBehind zuweisen. Verwenden Sie z. B. Code in folgenden Fällen:
- Sie weisen einem Element nach dem Laden der Markupseite, die das Element enthält, einen Ereignishandler zu.
- Sie fügen ein Element hinzu und weisen dessen Ereignishandler zu, nachdem die Markupseite, die das Element enthalten wird, geladen ist.
- Sie definieren die Elementstruktur für Ihre Anwendung vollständig im Code.
Voraussetzungen
Im Artikel wird davon ausgegangen, dass Sie über grundlegende Kenntnisse im Zusammenhang mit Routingereignissen verfügen und die Übersicht über Routingereignisse gelesen haben. Um den Beispielen in diesem Artikel zu folgen, hilft es Ihnen, wenn Sie mit Extensible Application Markup Language (XAML) vertraut sind und wissen, wie Sie Windows Presentation Foundation (WPF)-Anwendungen schreiben.
Syntax für ereignishandlerzuweisung
C# unterstützt die Ereignishandlerzuweisung mithilfe von:
- Der
+=Operator, der auch im ClR-Ereignisbehandlungsmodell (Common Language Runtime) verwendet wird. - Die UIElement.AddHandler-Methode.
VB unterstützt die Ereignishandlerzuweisung mithilfe von:
- Die AddHandler-Anweisung mit dem AddressOf-Operator , der auch im CLR-Ereignisbehandlungsmodell verwendet wird.
- Das Handles-Schlüsselwort in der Ereignishandlerdefinition. Weitere Informationen finden Sie unter Visual Basic und WPF-Ereignisbehandlung.
- Die UIElement.AddHandler Methode zusammen mit dem
AddressOfOperator, um auf den Ereignishandler zu verweisen.
Beispiel
Im folgenden Beispiel wird XAML verwendet, um ein Button mit dem Namen ButtonCreatedByXaml zu definieren und die ButtonCreatedByXaml_Click-Methode als Click-Ereignishandler zuzuweisen.
Click ist ein eingebautes geroutetes Ereignis für Schaltflächen, die von ButtonBase abgeleitet sind.
<StackPanel Name="StackPanel1">
<Button
Name="ButtonCreatedByXaml"
Click="ButtonCreatedByXaml_Click"
Content="Create a new button with an event handler"
Background="LightGray">
</Button>
</StackPanel>
Im Beispiel wird Code-Behind verwendet, um die Handler ButtonCreatedByXaml_Click und ButtonCreatedByCode_Click zu implementieren und den ButtonCreatedByCode_Click-Handler den ButtonCreatedByCode- und StackPanel1-Elementen zuzuweisen. Ereignishandlermethoden können nur in Codebehind implementiert werden.
// 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
Wenn ButtonCreatedByXaml angeklickt wird und sein Ereignishandler programmgesteuert ausgeführt wird: ButtonCreatedByXaml_Click
- Fügt der bereits erstellten XAML-Elementstruktur eine neue Schaltfläche mit dem Namen
ButtonCreatedByCodehinzu. - Gibt Eigenschaften für die neue Schaltfläche an, z. B. Name, Inhalt und Hintergrundfarbe.
- Weist den
ButtonCreatedByCode_ClickEreignishandler zuButtonCreatedByCode. - Weist
ButtonCreatedByCode_Clickdenselben Ereignishandler zuStackPanel1zu.
Wenn ButtonCreatedByCode geklickt wurde:
- Das Routingereignis Click wird auf
ButtonCreatedByCodeausgelöst. - Der
ButtonCreatedByCode_ClickzugewieseneButtonCreatedByCodeEreignishandler wird ausgelöst. - Das
Click-Routingereignis durchläuft die Elementstruktur aufStackPanel1. - Der
ButtonCreatedByCode_ClickzugewieseneStackPanel1Ereignishandler wird ausgelöst. - Das
Clickroutete Ereignis setzt seinen Weg entlang der Elementstruktur fort und kann dabei andereClickEreignishandler auslösen, die anderen durchlaufenen Elemente zugewiesen sind.
Der ButtonCreatedByCode_Click-Ereignishandler ruft die folgenden Informationen zum Ereignis ab, das es ausgelöst hat:
- Das Sender-Objekt , das das Element ist, dem der Ereignishandler zugewiesen ist.
senderistButtonCreatedByCode, wenn der Handler das erste Mal ausgeführt wird, undStackPanel1das zweite Mal. - Das RoutedEventArgs.Source-Objekt, bei dem es sich um das Element handelt, das das Ereignis ursprünglich ausgelöst hat. In diesem Beispiel ist
SourceimmerButtonCreatedByCode.
Hinweis
Ein wichtiger Unterschied zwischen einem routbaren Ereignis und einem CLR-Ereignis besteht darin, dass ein routbares Ereignis die Elementstruktur durchläuft und nach Handlern sucht, während ein CLR-Ereignis dies nicht tut und Handler nur an das Quellobjekt angefügt werden können, das das Ereignis ausgelöst hat. Daher kann ein Routingereignis sender jedes durchlaufene Element in der Elementstruktur sein.
Weitere Informationen zum Erstellen und Behandeln von Routingereignissen finden Sie unter Wie man ein benutzerdefiniertes Routingereignis erstellt und Ein Routingereignis behandeln
Siehe auch
.NET Desktop feedback