Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Puedes asignar un controlador de eventos a un elemento de Windows Presentation Foundation (WPF) mediante marcado o código subyacente. Aunque es habitual asignar un controlador de eventos en lenguaje de marcado extensible de aplicaciones (XAML), a veces es posible que tengas que asignar un controlador de eventos en el código subyacente. Por ejemplo, use código cuando:
- Asigna un controlador de eventos a un elemento después de que la página de marcado que contiene el elemento se cargue.
- Añada un elemento y asigne su controlador de eventos después de que la página de marcado que contendrá el elemento se haya cargado.
- El árbol de elementos se define para la aplicación completamente en el código.
Prerrequisitos
El artículo supone un conocimiento básico de los eventos enrutados y que hayas leído Información general sobre eventos enrutados. Para seguir los ejemplos de este artículo, le ayuda si está familiarizado con el lenguaje de marcado extensible de aplicaciones (XAML) y sabe cómo escribir aplicaciones de Windows Presentation Foundation (WPF).
Sintaxis para la asignación del controlador de eventos
C# admite la asignación del controlador de eventos mediante:
- Operador
+=
, que también se usa en el modelo de control de eventos de Common Language Runtime (CLR). - Método UIElement.AddHandler.
VB admite la asignación del controlador de eventos mediante:
- La instrucción AddHandler con el operador AddressOf , que también se usa en el modelo de control de eventos CLR.
- Palabra clave Handles en la definición del controlador de eventos. Para obtener más información, vea Control de eventos de Visual Basic y WPF.
- El UIElement.AddHandler método junto con el operador
AddressOf
para hacer referencia al controlador de eventos.
Ejemplo
En el ejemplo siguiente se usa XAML para definir un Button objeto con nombre ButtonCreatedByXaml
y asignar el ButtonCreatedByXaml_Click
método como controlador Click de eventos.
Click
es un evento enrutado integrado para los botones que derivan de ButtonBase.
<StackPanel Name="StackPanel1">
<Button
Name="ButtonCreatedByXaml"
Click="ButtonCreatedByXaml_Click"
Content="Create a new button with an event handler"
Background="LightGray">
</Button>
</StackPanel>
En el ejemplo se usa código subyacente para implementar los controladores ButtonCreatedByXaml_Click
y ButtonCreatedByCode_Click
, y para asignar el controlador ButtonCreatedByCode_Click
a los elementos ButtonCreatedByCode
y StackPanel1
. Los métodos del controlador de eventos solo se pueden implementar en código subyacente.
// 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
Cuando se hace clic en ButtonCreatedByXaml
y se ejecuta su controlador de eventos, ButtonCreatedByXaml_Click
lo hace mediante programación.
- Agrega un nuevo botón denominado
ButtonCreatedByCode
al árbol de elementos XAML ya construido. - Especifica las propiedades del nuevo botón, como el nombre, el contenido y el color de fondo.
- Asigna el
ButtonCreatedByCode_Click
controlador de eventos aButtonCreatedByCode
. - Asigna el mismo
ButtonCreatedByCode_Click
controlador de eventos aStackPanel1
.
Al hacer clic en ButtonCreatedByCode
:
- El Click evento enrutado se genera en
ButtonCreatedByCode
. - El
ButtonCreatedByCode_Click
controlador de eventos asignado aButtonCreatedByCode
se desencadena. - El
Click
evento enrutado atraviesa el árbol de elementos aStackPanel1
. - El
ButtonCreatedByCode_Click
controlador de eventos asignado aStackPanel1
se desencadena. - El
Click
evento enrutado continúa hacia arriba por el árbol de elementos, potencialmente desencadenando otrosClick
controladores de eventos asignados a otros elementos recorridos.
El ButtonCreatedByCode_Click
controlador de eventos obtiene la siguiente información sobre el evento que lo desencadenó:
- Objeto remitente , que es el elemento al que se asigna el controlador de eventos. El valor de
sender
seráButtonCreatedByCode
la primera vez que se ejecute el controlador yStackPanel1
la segunda. - Objeto RoutedEventArgs.Source , que es el elemento que generó originalmente el evento. En este ejemplo, el
Source
siempre esButtonCreatedByCode
.
Nota:
Una diferencia clave entre un evento enrutado y un evento CLR es que un evento enrutado atraviesa el árbol de elementos, buscando controladores, mientras que un evento CLR no atraviesa el árbol de elementos y los controladores solo pueden asociarse al objeto de origen que generó el evento. Como resultado, un evento sender
enrutado puede ser cualquier elemento recorrido en el árbol de elementos.
Para obtener más información sobre cómo crear y controlar eventos enrutados, consulte Creación de un evento enrutado personalizado y Control de un evento enrutado.
Consulte también
.NET Desktop feedback