Compartir a través de


Adición de un controlador de eventos mediante código

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:

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.

  1. Agrega un nuevo botón denominado ButtonCreatedByCode al árbol de elementos XAML ya construido.
  2. Especifica las propiedades del nuevo botón, como el nombre, el contenido y el color de fondo.
  3. Asigna el ButtonCreatedByCode_Click controlador de eventos a ButtonCreatedByCode.
  4. Asigna el mismo ButtonCreatedByCode_Click controlador de eventos a StackPanel1.

Al hacer clic en ButtonCreatedByCode:

  1. El Click evento enrutado se genera en ButtonCreatedByCode.
  2. El ButtonCreatedByCode_Click controlador de eventos asignado a ButtonCreatedByCode se desencadena.
  3. El Click evento enrutado atraviesa el árbol de elementos a StackPanel1.
  4. El ButtonCreatedByCode_Click controlador de eventos asignado a StackPanel1 se desencadena.
  5. El Click evento enrutado continúa hacia arriba por el árbol de elementos, potencialmente desencadenando otros Click 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 y StackPanel1 la segunda.
  • Objeto RoutedEventArgs.Source , que es el elemento que generó originalmente el evento. En este ejemplo, el Source siempre es ButtonCreatedByCode.

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