Практическое руководство. Добавление обработчика событий с помощью кода (WPF .NET)
Обработчик событий можно назначить элементу в Windows Presentation Foundation (WPF) с помощью разметки или кода программной части. Хотя обычно назначается обработчик событий на языке XAML, иногда может потребоваться назначить обработчик событий в коде программной части. Например, код используется, когда:
- обработчик событий назначается элементу после страницы разметки с загрузками элемента;
- добавляется элемент и ему назначается обработчик событий после страницы разметки с загрузками элемента;
- дерево элементов для приложения определяется полностью в коде.
Важно!
Документация по рабочему столу для .NET 7 и .NET 6 находится в стадии разработки.
Необходимые компоненты
Для понимания статьи нужно иметь общее представление о перенаправленных событиях и прочитать статью Общие сведения о перенаправленных событиях. Чтобы понимать примеры в этой статье полезно познакомиться с языком XAML и знать, как создавать приложения Windows Presentation Foundation (WPF).
Синтаксис назначения обработчика событий
Язык C# поддерживает назначение обработчика событий с использованием следующих средств:
- оператор
+=
, который также используется в модели обработки событий CLR; - метод UIElement.AddHandler ;
Язык VB поддерживает назначение обработчика событий с использованием следующих средств:
- Инструкция AddHandler с оператором AddressOf, который также используется в модели обработки событий CLR.
- Ключевое слово Handles в определении обработчика событий. Дополнительные сведения см. в разделе Обработка событий в Visual Basic и WPF.
- Метод UIElement.AddHandler вместе с оператором
AddressOf
, чтобы ссылаться на обработчик событий.
Пример
В следующем примере для определения Button с именем ButtonCreatedByXaml
и назначения метода ButtonCreatedByXaml_Click
в качестве обработчика события Click используется язык XAML. Click
— это встроенное перенаправленное событие для кнопок, производных от класса ButtonBase.
<StackPanel Name="StackPanel1">
<Button
Name="ButtonCreatedByXaml"
Click="ButtonCreatedByXaml_Click"
Content="Create a new button with an event handler"
Background="LightGray">
</Button>
</StackPanel>
В примере используется код программной части для реализации ButtonCreatedByXaml_Click
и ButtonCreatedByCode_Click
обработчиков, а также для назначения обработчика ButtonCreatedByCode_Click
элементам ButtonCreatedByCode
и StackPanel1
. Методы обработчика событий могут быть реализованы только в коде программной части.
// 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
Если щелкнуть ButtonCreatedByXaml
и выполняются его обработчик событий, ButtonCreatedByXaml_Click
программно:
- добавляет новую кнопку с именем
ButtonCreatedByCode
в уже созданное дерево элементов XAML; - задает свойства новой кнопки, например имя, содержимое и цвет фона;
- назначает обработчик событий
ButtonCreatedByCode_Click
элементуButtonCreatedByCode
; - назначает тот же самый обработчик событий
ButtonCreatedByCode_Click
элементуStackPanel1
.
Если щелкнуть ButtonCreatedByCode
:
- В
ButtonCreatedByCode
вызывается перенаправленное событие Click. - Инициируется обработчик событий
ButtonCreatedByCode_Click
, назначенный элементуButtonCreatedByCode
. - Перенаправленное событие
Click
перемещается вверх по дереву элементов к контейнеруStackPanel1
. - Инициируется обработчик событий
ButtonCreatedByCode_Click
, назначенный элементуStackPanel1
. - Перенаправленное событие
Click
продолжается перемещаться вверх по дереву элементов. Потенциально оно может активировать другие обработчики событийClick
, назначенные другим пройденным элементам.
Обработчик событий ButtonCreatedByCode_Click
получает следующие сведения о вызвавшее его событии:
- Объект отправителя, который является элементом, которому назначен обработчик событий. Обработчик
sender
запускается дляButtonCreatedByCode
первый раз, а дляStackPanel1
второй раз. - Объект RoutedEventArgs.Source, являющийся элементом, который изначально вызвал событие. В этом примере
Source
всегда являетсяButtonCreatedByCode
.
Примечание.
Ключевое различие между перенаправленным событием и событием среды CLR заключается в том, что перенаправленное событие проходит по дереву элементов в поисках обработчиков, тогда как событие среды CLR не проходит по дереву элементов, а обработчики могут подключаться только к исходному объекту, вызвавшему событие. В результате перенаправленное событие sender
может быть любым пройденным элементом в дереве элементов.
Дополнительные сведения о создании и обработке перенаправленных событий см. в статьях Практическое руководство. Создание пользовательских перенаправленных событий и Обработка перенаправленного события.
См. также
.NET Desktop feedback
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по