Gewusst wie: Hinzufügen eines Ereignishandlers mithilfe von Code (WPF .NET)
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 den Code zum Beispiel, wenn:
- Sie weisen einem Element nach der Markupseite, die das Element lädt, einen Ereignishandler zu.
- Sie fügen ein Element hinzu und weisen den Ereignishandler nach der Markupseite zu, die das Element lädt.
- Sie definieren die Elementstruktur für Ihre Anwendung vollständig im Code.
Voraussetzungen
Im Artikel wird davon ausgegangen, dass Sie grundlegende Kenntnisse über Routingereignisse besitzen und die Übersicht über Routingereignisse gelesen haben. Um den Beispielen in diesem Artikel zu folgen, ist es hilfreich, wenn Sie mit Extensible Application Markup Language (XAML) vertraut sind und wissen, wie Windows Presentation Foundation-Anwendungen (WPF-Anwendungen) geschrieben werden.
Syntax für die Zuordnung des Ereignishandlers
C# unterstützt die Ereignishandlerzuweisung mithilfe von:
- Der
+=
-Operator, der auch im Common Language Runtime (CLR)-Ereignisbehandlungsmodell 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 Operator, um auf den
AddressOf
-Ereignishandler zu verweisen.
Beispiel
Im folgenden Beispiel wird XAML verwendet, um einen Button mit Namen ButtonCreatedByXaml
zu definieren und die ButtonCreatedByXaml_Click
-Methode als Click-Ereignishandler zuzuweisen. Click
ist ein integriertes weitergeleitetes 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 CodeBehind verwendet, um die Handler ButtonCreatedByXaml_Click
und ButtonCreatedByCode_Click
zu implementieren und dem ButtonCreatedByCode_Click
-Handler den Elementn ButtonCreatedByCode
und StackPanel1
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
geklickt ist und der Ereignishandler ausgeführt wird, wird ButtonCreatedByXaml_Click
programmgesteuert Folgendes ausführen:
- Fügt der bereits erstellten XAML-Elementstruktur eine neue Schaltfläche mit Namen
ButtonCreatedByCode
hinzu. - Gibt Eigenschaften für die neue Schaltfläche an, z. B. den Namen, den Inhalt und die Hintergrundfarbe.
- Weist den
ButtonCreatedByCode_Click
-EreignishandlerButtonCreatedByCode
zu. - Weist den gleichen
ButtonCreatedByCode_Click
-EreignishandlerStackPanel1
zu.
Wenn ButtonCreatedByCode
geklickt wurde:
- Das Routingereignis Click wird auf
ButtonCreatedByCode
ausgelöst. - Der
ButtonCreatedByCode_Click
-Ereignishandler, derButtonCreatedByCode
zugewiesen wurde, wird ausgelöst. - Das
Click
-Routingereignis durchläuft die Elementstruktur aufStackPanel1
. - Der
ButtonCreatedByCode_Click
-Ereignishandler, derStackPanel1
zugewiesen wurde, wird ausgelöst. - Das
Click
-Routingereignis führt die Elementstruktur aus, die möglicherweise andereClick
-Ereignishandler auslösen, die anderen durchlaufenen Elementen zugewiesen sind.
Der ButtonCreatedByCode_Click
-Ereignishandler ruft die folgenden Informationen zum Ereignis ab, das sie ausgelöst hat:
- Das Sender-Objekt, d. h. das Element, dem der Ereignishandler zugewiesen ist.
sender
istButtonCreatedByCode
, wenn der Handler das erste Mal ausgeführt wird, undStackPanel1
das zweite Mal. - Das RoutedEventArgs.Source-Objekt, das das Element ist, das das Ereignis ursprünglich ausgelöst hat. In diesem Beispiel ist
Source
immerButtonCreatedByCode
.
Hinweis
Ein wichtiger Unterschied zwischen einem routed-Ereignis und einem CLR-Ereignis besteht darin, dass ein weitergeleitetes Ereignis die Elementstruktur durchläuft und nach Handlern sucht, während ein CLR-Ereignis die Elementstruktur und Handler nicht durchlaufen, kann nur an das Quellobjekt angefügt werden, das das Ereignis ausgelöst hat. Daher kann ein weitergeleitetes Ereignis sender
jedes durchlaufene Element in der Elementstruktur sein.
Weitere Informationen zum Erstellen und Behandeln von weitergeleiteten Ereignissen finden Sie unter Erstellen eines benutzerdefinierten Routingereignisses und Behandeln eines Routingereignisses.
Siehe auch
.NET Desktop feedback