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.
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:
- Dodaje nowy przycisk o nazwie
ButtonCreatedByCode
do już skonstruowanego drzewa elementów XAML. - Określa właściwości nowego przycisku, takie jak nazwa, zawartość i kolor tła.
- Przypisuje procedurę obsługi zdarzeń
ButtonCreatedByCode_Click
doButtonCreatedByCode
programu . - Przypisuje tę samą
ButtonCreatedByCode_Click
procedurę obsługi zdarzeń doStackPanel1
programu .
Po ButtonCreatedByCode
kliknięciu:
- Zdarzenie Click kierowane jest wywoływane w pliku
ButtonCreatedByCode
. - Wyzwalana
ButtonCreatedByCode_Click
jest procedura obsługi zdarzeń przypisana doButtonCreatedByCode
. - Zdarzenie
Click
kierowane przechodzi w górę drzewa elementów doStackPanel1
. - Wyzwalana
ButtonCreatedByCode_Click
jest procedura obsługi zdarzeń przypisana doStackPanel1
. - Zdarzenie
Click
kierowane kontynuuje drzewo elementów potencjalnie wyzwalające inneClick
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
toButtonCreatedByCode
pierwszy raz, gdy program obsługi zostanie uruchomiony, aStackPanel1
drugi raz. - RoutedEventArgs.Source Obiekt, który jest elementem, który pierwotnie wzbudził zdarzenie. W tym przykładzie parametr ma
Source
zawszeButtonCreatedByCode
wartość .
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ż
.NET Desktop feedback