So wird's ausgeführt: Hinzufügen eines Ereignishandlers mithilfe von Code (WPF .NET)
Sie können einem Element in Windows Presentation Foundation (WPF) mithilfe von Markup oder Code-Behind 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 seinem Ereignishandler zu, nachdem die Markupseite, die das Element enthalten wird, geladen wurde.
- Sie definieren den Elementbaum für Ihre Anwendung vollständig im Code.
Voraussetzungen
In diesem Artikel wird ein grundlegendes Wissen über Routingerereignisse vorausgesetzt; zudem sollten Sie die Übersicht über Routingerereignissegelesen 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 Ereignishandler-Zuweisung
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 im CLR-Ereignisbehandlungsmodell auch verwendet wird.
- Das -Handles Schlüsselwort in der Ereignishandlerdefinition. Weitere Informationen finden Sie unter Visual Basic- und WPF-Ereignisbehandlung.
- Die Methode UIElement.AddHandler wird zusammen mit dem Operator
AddressOf
verwendet, um auf den Ereignishandler zu verweisen.
Beispiel
Im folgenden Beispiel wird XAML verwendet, um ein Button namens ButtonCreatedByXaml
zu definieren und die ButtonCreatedByXaml_Click
-Methode als seinen Click-Ereignishandler zuzuweisen. Click
ist ein integriertes Routingereignis für Schaltflächen, die von ButtonBaseabgeleitet werden.
<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 ButtonCreatedByXaml_Click
- und ButtonCreatedByCode_Click
-Handler zu implementieren und den ButtonCreatedByCode_Click
-Handler den elementen 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 wird und der Ereignishandler ausgeführt wird, wird ButtonCreatedByXaml_Click
programmgesteuert:
- Fügt der bereits erstellten XAML-Elementstruktur eine neue Schaltfläche mit dem Namen
ButtonCreatedByCode
hinzu. - Gibt Eigenschaften für die neue Schaltfläche an, z. B. Name, Inhalt und Hintergrundfarbe.
- Weist den Ereignishandler
ButtonCreatedByCode_Click
zuButtonCreatedByCode
zu. - Weist dem
StackPanel1
den selbenButtonCreatedByCode_Click
-Ereignishandler zu.
Wenn auf ButtonCreatedByCode
geklickt wird:
- Das Click Routingereignis wird auf
ButtonCreatedByCode
ausgelöst. - Der
ButtonCreatedByCode_Click
Ereignishandler, derButtonCreatedByCode
zugewiesen ist, wird ausgelöst. - Das
Click
-Routereignis durchläuft nach oben die Elementstruktur bis zuStackPanel1
. - Der
ButtonCreatedByCode_Click
Ereignishandler, derStackPanel1
zugewiesen ist, wird ausgelöst. - Das
Click
Routed Event bewegt sich nach oben in der Elementstruktur und löst möglicherweise andereClick
Ereignishandler aus, die anderen durchlaufenen Elementen zugewiesen sind.
Der ButtonCreatedByCode_Click
-Ereignishandler ruft die folgenden Informationen zum Ereignis ab, das es ausgelöst hat:
- Das Sender--Objekt ist das Element, dem der Ereignishandler zugewiesen ist. Die
sender
wird beim ersten Ausführen des Handlers zum ersten MalButtonCreatedByCode
und beim zweiten MalStackPanel1
. - Das RoutedEventArgs.Source-Objekt, bei dem es sich um das Element handelt, das das Ereignis ursprünglich ausgelöst hat. In diesem Beispiel ist der
Source
immerButtonCreatedByCode
.
Anmerkung
Ein wesentlicher Unterschied zwischen einem geleiteten Ereignis und einem CLR-Ereignis besteht darin, dass ein geleitetes Ereignis die Elementstruktur durchläuft und nach Handlern sucht, während ein CLR-Ereignis die Elementstruktur nicht durchläuft, und Handler nur an das Quellobjekt angefügt werden können, das das Ereignis ausgelöst hat. Daher kann ein geroutetes Ereignis sender
jedes durchlaufene Element im Elementbaum sein.
Weitere Informationen zum Erstellen und Behandeln von Routingereignissen finden Sie unter Erstellen eines benutzerdefinierten Routingereignisses und Behandeln eines Routingereignisses.
Siehe auch
.NET Desktop feedback