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.

Wichtig

Der Desktopleitfaden zu .NET 7 und .NET 6 ist in Bearbeitung.

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:

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:

  1. Fügt der bereits erstellten XAML-Elementstruktur eine neue Schaltfläche mit Namen ButtonCreatedByCode hinzu.
  2. Gibt Eigenschaften für die neue Schaltfläche an, z. B. den Namen, den Inhalt und die Hintergrundfarbe.
  3. Weist den ButtonCreatedByCode_Click-Ereignishandler ButtonCreatedByCode zu.
  4. Weist den gleichen ButtonCreatedByCode_Click-Ereignishandler StackPanel1 zu.

Wenn ButtonCreatedByCode geklickt wurde:

  1. Das Routingereignis Click wird auf ButtonCreatedByCodeausgelöst.
  2. Der ButtonCreatedByCode_Click-Ereignishandler, der ButtonCreatedByCode zugewiesen wurde, wird ausgelöst.
  3. Das Click-Routingereignis durchläuft die Elementstruktur auf StackPanel1.
  4. Der ButtonCreatedByCode_Click-Ereignishandler, der StackPanel1 zugewiesen wurde, wird ausgelöst.
  5. Das Click-Routingereignis führt die Elementstruktur aus, die möglicherweise andere Click-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 ist ButtonCreatedByCode, wenn der Handler das erste Mal ausgeführt wird, und StackPanel1 das zweite Mal.
  • Das RoutedEventArgs.Source-Objekt, das das Element ist, das das Ereignis ursprünglich ausgelöst hat. In diesem Beispiel ist Source immer ButtonCreatedByCode.

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