Jak dodać procedurę obsługi zdarzeń przy użyciu kodu (WPF .NET)

Program obsługi zdarzeń można przypisać do elementu w programie Windows Presentation Foundation (WPF) przy użyciu znaczników lub kodu za pomocą kodu. Chociaż program obsługi zdarzeń jest przypisywany do programu obsługi zdarzeń w języku XAML (Extensible Application Markup Language), czasami może być konieczne przypisanie procedury obsługi zdarzeń w kodzie. Na przykład użyj kodu, gdy:

  • Program obsługi zdarzeń jest przypisywany do elementu po stronie znaczników zawierającej łady element.
  • Element należy dodać i przypisać jego procedurę obsługi zdarzeń po stronie znaczników, która będzie zawierać łady elementu.
  • Należy zdefiniować drzewo elementów dla aplikacji w całości w kodzie.

Ważne

Dokumentacja przewodnika dla komputerów dla platform .NET 7 i .NET 6 jest w budowie.

Wymagania wstępne

W tym artykule przyjęto założenie, że masz podstawową wiedzę na temat zdarzeń kierowanych i zapoznasz się z omówieniem zdarzeń trasowanych. Aby postępować zgodnie z przykładami w tym artykule, warto zapoznać się z językiem Extensible Application Markup Language (XAML) i wiedzieć, jak pisać aplikacje programu Windows Presentation Foundation (WPF).

Składnia przypisania procedury obsługi zdarzeń

Język C# obsługuje przypisywanie programu obsługi zdarzeń przy użyciu:

  • Operator += , który jest również używany w modelu obsługi zdarzeń środowiska uruchomieniowego języka wspólnego (CLR).
  • Metoda UIElement.AddHandler .

Język VB obsługuje przypisanie procedury obsługi zdarzeń przy użyciu:

  • Instrukcja AddHandler z operatorem AddressOf , który jest również używany w modelu obsługi zdarzeń CLR.
  • Słowo kluczowe Handles w definicji programu obsługi zdarzeń. Aby uzyskać więcej informacji, zobacz Obsługa zdarzeń Visual Basic i WPF.
  • Metoda UIElement.AddHandler wraz z operatorem AddressOf odwołującą się do procedury obsługi zdarzeń.

Przykład

W poniższym przykładzie użyto języka XAML, aby zdefiniować nazwę ButtonCreatedByXaml i przypisać ButtonCreatedByXaml_Click metodę Button jako procedurę Click obsługi zdarzeń. Click jest wbudowanym zdarzeniem kierowanym dla przycisków, które pochodzą z ButtonBase.

<StackPanel Name="StackPanel1">
    <Button
        Name="ButtonCreatedByXaml" 
        Click="ButtonCreatedByXaml_Click"
        Content="Create a new button with an event handler"
        Background="LightGray">
    </Button>
</StackPanel>

W przykładzie użyto kodu do zaimplementowania ButtonCreatedByXaml_Click procedur obsługi i ButtonCreatedByCode_Click oraz przypisania ButtonCreatedByCode_Click procedury obsługi do ButtonCreatedByCode elementów i StackPanel1 . Metody obsługi zdarzeń można zaimplementować tylko w kodzie.

// 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

Po ButtonCreatedByXaml kliknięciu i uruchomieniu ButtonCreatedByXaml_Click programu obsługi zdarzeń programowo:

  1. Dodaje nowy przycisk o nazwie ButtonCreatedByCode do już skonstruowanego drzewa elementów XAML.
  2. Określa właściwości nowego przycisku, takie jak nazwa, zawartość i kolor tła.
  3. Przypisuje procedurę obsługi zdarzeń ButtonCreatedByCode_Click do ButtonCreatedByCodeprogramu .
  4. Przypisuje tę samą ButtonCreatedByCode_Click procedurę obsługi zdarzeń do StackPanel1programu .

Po ButtonCreatedByCode kliknięciu:

  1. Zdarzenie Click kierowane jest wywoływane w pliku ButtonCreatedByCode.
  2. Wyzwalana ButtonCreatedByCode_Click jest procedura obsługi zdarzeń przypisana do ButtonCreatedByCode .
  3. Zdarzenie Click kierowane przechodzi w górę drzewa elementów do StackPanel1.
  4. Wyzwalana ButtonCreatedByCode_Click jest procedura obsługi zdarzeń przypisana do StackPanel1 .
  5. Zdarzenie Click kierowane kontynuuje drzewo elementów potencjalnie wyzwalające inne Click programy obsługi zdarzeń przypisane do innych elementów przechodzących.

Procedura ButtonCreatedByCode_Click obsługi zdarzeń uzyskuje następujące informacje o zdarzeniu, które go wyzwoliło:

  • Obiekt nadawcy , który jest elementem przypisanym do programu obsługi zdarzeń. Będzie sender to ButtonCreatedByCode pierwszy raz, gdy program obsługi zostanie uruchomiony, a StackPanel1 drugi raz.
  • RoutedEventArgs.Source Obiekt, który jest elementem, który pierwotnie wzbudził zdarzenie. W tym przykładzie parametr ma Source zawsze ButtonCreatedByCodewartość .

Uwaga

Kluczową różnicą między zdarzeniem kierowanym a zdarzeniem CLR jest to, że zdarzenie kierowane przechodzi przez drzewo elementów, szukając procedur obsługi, podczas gdy zdarzenie CLR nie przechodzi przez drzewo elementów i programy obsługi mogą dołączać tylko do obiektu źródłowego, który wywołał zdarzenie. W związku z tym zdarzenie sender kierowane może być dowolnym elementem przechodzenia w drzewie elementów.

Aby uzyskać więcej informacji na temat tworzenia i obsługi zdarzeń trasowanych, zobacz Jak utworzyć niestandardowe zdarzenie kierowane i obsługiwać zdarzenie kierowane.

Zobacz też