Практическое руководство. Добавление обработчика событий с помощью кода (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 программно:

  1. добавляет новую кнопку с именем ButtonCreatedByCode в уже созданное дерево элементов XAML;
  2. задает свойства новой кнопки, например имя, содержимое и цвет фона;
  3. назначает обработчик событий ButtonCreatedByCode_Click элементу ButtonCreatedByCode;
  4. назначает тот же самый обработчик событий ButtonCreatedByCode_Click элементу StackPanel1.

Если щелкнуть ButtonCreatedByCode:

  1. В ButtonCreatedByCode вызывается перенаправленное событие Click.
  2. Инициируется обработчик событий ButtonCreatedByCode_Click, назначенный элементу ButtonCreatedByCode.
  3. Перенаправленное событие Click перемещается вверх по дереву элементов к контейнеру StackPanel1.
  4. Инициируется обработчик событий ButtonCreatedByCode_Click, назначенный элементу StackPanel1.
  5. Перенаправленное событие Click продолжается перемещаться вверх по дереву элементов. Потенциально оно может активировать другие обработчики событий Click, назначенные другим пройденным элементам.

Обработчик событий ButtonCreatedByCode_Click получает следующие сведения о вызвавшее его событии:

  • Объект отправителя, который является элементом, которому назначен обработчик событий. Обработчик sender запускается дляButtonCreatedByCode первый раз, а для StackPanel1 второй раз.
  • Объект RoutedEventArgs.Source, являющийся элементом, который изначально вызвал событие. В этом примере Source всегда является ButtonCreatedByCode.

Примечание.

Ключевое различие между перенаправленным событием и событием среды CLR заключается в том, что перенаправленное событие проходит по дереву элементов в поисках обработчиков, тогда как событие среды CLR не проходит по дереву элементов, а обработчики могут подключаться только к исходному объекту, вызвавшему событие. В результате перенаправленное событие sender может быть любым пройденным элементом в дереве элементов.

Дополнительные сведения о создании и обработке перенаправленных событий см. в статьях Практическое руководство. Создание пользовательских перенаправленных событий и Обработка перенаправленного события.

См. также