Freigeben über


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:

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:

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

Wenn auf ButtonCreatedByCode geklickt wird:

  1. Das Click Routingereignis wird auf ButtonCreatedByCodeausgelöst.
  2. Der ButtonCreatedByCode_Click Ereignishandler, der ButtonCreatedByCode zugewiesen ist, wird ausgelöst.
  3. Das Click-Routereignis durchläuft nach oben die Elementstruktur bis zu StackPanel1.
  4. Der ButtonCreatedByCode_Click Ereignishandler, der StackPanel1 zugewiesen ist, wird ausgelöst.
  5. Das Click Routed Event bewegt sich nach oben in der Elementstruktur und löst möglicherweise andere Click 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 Mal ButtonCreatedByCode und beim zweiten Mal StackPanel1.
  • 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 immer ButtonCreatedByCode.

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