Files
docs-desktop/dotnet-desktop-guide/net/wpf/events/how-to-add-an-event-handler-using-code.md
T
Tris Shores d9125bf6ea Content update - Handle events in Visual Basic (user story 1878475) (#1320)
* Add article, toc, and redirects

* Add code snippets

* Fix a note in a prior event article

* Add tip and fix lnk

* Simplify snippet
2022-03-04 10:35:13 -08:00

77 lines
5.6 KiB
Markdown

---
title: "How to add an event handler using code"
description: Learn how to add an event handler in code-behind for an element in Windows Presentation Foundation (WPF).
ms.date: "02/01/2021"
dev_langs:
- "csharp"
- "vb"
helpviewer_keywords:
- "event handlers [WPF], adding"
- "XAML [WPF], adding event handlers"
---
<!-- The acrolinx score was 99 on 02/01/2021-->
# How to add an event handler using code (WPF .NET)
You can assign an event handler to an element in Windows Presentation Foundation (WPF) using markup or code-behind. Although it's customary to assign an event handler in Extensible Application Markup Language (XAML), sometimes you might have to assign an event handler in code-behind. For instance, use code when:
- You assign an event handler to an element after the markup page that contains the element loads.
- You add an element and assign its event handler after the markup page that will contain the element loads.
- You define the element tree for your application entirely in code.
[!INCLUDE [desktop guide under construction](../../includes/desktop-guide-preview-note.md)]
## Syntax for event handler assignment
C# supports event handler assignment using:
- The `+=` operator, which is also used in the common language runtime (CLR) event handling model.
- The <xref:System.Windows.UIElement.AddHandler%2A?displayProperty=nameWithType> method.
VB supports event handler assignment using:
- The [AddHandler](/dotnet/visual-basic/language-reference/statements/addhandler-statement) statement with the [AddressOf](/dotnet/visual-basic/language-reference/operators/addressof-operator) operator, which is also used in the CLR event handling model.
- The [Handles](/dotnet/visual-basic/language-reference/statements/handles-clause) keyword in the event handler definition. For more information, see [Visual Basic and WPF event handling](/dotnet/desktop/wpf/advanced/visual-basic-and-wpf-event-handling?view=netframeworkdesktop-4.8&preserve-view=true).
- The <xref:System.Windows.UIElement.AddHandler%2A?displayProperty=nameWithType> method, together with the `AddressOf` operator to reference the event handler.
## Example
The following example uses XAML to define a <xref:System.Windows.Controls.Button> named `ButtonCreatedByXaml` and to assign the `ButtonCreatedByXaml_Click` method as its <xref:System.Windows.Controls.Primitives.ButtonBase.Click> event handler. `Click` is a built-in routed event for buttons that derive from <xref:System.Windows.Controls.Primitives.ButtonBase>.
:::code language="xaml" source="./snippets/how-to-add-an-event-handler-using-code/csharp/MainWindow.xaml" id="ButtonCreatedByXaml":::
The example uses code-behind to implement the `ButtonCreatedByXaml_Click` and `ButtonCreatedByCode_Click` handlers, and to assign the `ButtonCreatedByCode_Click` handler to the `ButtonCreatedByCode` and `StackPanel1` elements. Event handler methods can only be implemented in code-behind.
:::code language="csharp" source="./snippets/how-to-add-an-event-handler-using-code/csharp/MainWindow.xaml.cs" id="ButtonEventHandlers":::
:::code language="vb" source="./snippets/how-to-add-an-event-handler-using-code/vb/MainWindow.xaml.vb" id="ButtonEventHandlers":::
When `ButtonCreatedByXaml` is clicked and its event handler runs, `ButtonCreatedByXaml_Click` programmatically:
1. Adds a new button named `ButtonCreatedByCode` to the already constructed XAML element tree.
1. Specifies properties for the new button, such as the name, content, and background color.
1. Assigns the `ButtonCreatedByCode_Click` event handler to `ButtonCreatedByCode`.
1. Assigns the same `ButtonCreatedByCode_Click` event handler to `StackPanel1`.
When `ButtonCreatedByCode` is clicked:
1. The <xref:System.Windows.Controls.Primitives.ButtonBase.Click> routed event is raised on `ButtonCreatedByCode`.
1. The `ButtonCreatedByCode_Click` event handler assigned to `ButtonCreatedByCode` is triggered.
1. The `Click` routed event traverses up the element tree to `StackPanel1`.
1. The `ButtonCreatedByCode_Click` event handler assigned to `StackPanel1` is triggered.
1. The `Click` routed event continues up the element tree potentially triggering other `Click` event handlers assigned to other traversed elements.
The `ButtonCreatedByCode_Click` event handler obtains the following information about the event that triggered it:
- The [sender](xref:System.Windows.RoutedEventHandler) object, which is the element that the event handler is assigned to. The `sender` will be `ButtonCreatedByCode` the first time the handler runs, and `StackPanel1` the second time.
- The <xref:System.Windows.RoutedEventArgs.Source?displayProperty=nameWithType> object, which is the element that originally raised the event. In this example, the `Source` is always `ButtonCreatedByCode`.
> [!NOTE]
> A key difference between a routed event and a CLR event is that a routed event traverses the element tree, looking for handlers, whereas a CLR event doesn't traverse the element tree and handlers can only attach to the source object that raised the event. As a result, a routed event `sender` can be any traversed element in the element tree.
For more information on how to create and handle routed events, see [How to create a custom routed event](/dotnet/desktop/wpf/advanced/how-to-create-a-custom-routed-event?view=netframeworkdesktop-4.8&preserve-view=true) and [Handle a routed event](/dotnet/desktop/wpf/advanced/how-to-handle-a-routed-event?view=netframeworkdesktop-4.8&preserve-view=true).
## See also
- [Routed events overview](/dotnet/desktop/wpf/advanced/routed-events-overview?view=netframeworkdesktop-4.8&preserve-view=true)
- [XAML in WPF](/dotnet/desktop/wpf/advanced/xaml-in-wpf?view=netframeworkdesktop-4.8&preserve-view=true)