Cómo: Controlar un evento enrutado

En este ejemplo se muestra cómo funcionan los eventos de propagación y cómo se escribe un controlador capaz de procesar los datos del evento enrutado.

Ejemplo

En Windows Presentation Foundation (WPF), los elementos se organizan organizados en una estructura de árbol de elementos. El elemento primario puede participar en el control de los eventos provocados inicialmente por elementos secundarios del árbol de elementos. Esto es posible gracias al enrutamiento de eventos.

Los eventos enrutados suelen seguir una de las dos estrategias de enrutamiento, propagación o túnel. Este ejemplo se centra en el evento de propagación y utiliza el evento ButtonBase.Click para mostrar cómo funciona el enrutamiento.

En el ejemplo siguiente se crean dos controles Button y se utiliza la sintaxis de atributo de XAML para adjuntar un controlador de eventos a un elemento primario común, que en este ejemplo es StackPanel. En lugar de asociar los controladores de eventos individuales a cada elemento secundario Button, en el ejemplo se utiliza la sintaxis de atributo para asociar el controlador de eventos al elemento primario StackPanel. Este modelo de control de eventos muestra cómo utilizar el enrutamiento de eventos como técnica para reducir el número de elementos a los que se asocia un controlador. Todos los eventos de propagación de cada Button se enrutan a través del elemento primario.

Observe que en el elemento primario StackPanel, el nombre del evento Click especificado como atributo se certifica parcialmente nombrando la clase Button. La clase Button es una clase derivada de ButtonBase que tiene el evento Click en su lista de miembros. Esta técnica de la certificación parcial para asociar un controlador de eventos es necesaria si el evento controlado no existe en la lista de miembros del elemento al que está asociado el controlador del evento enrutado.

<StackPanel
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.RoutedEventHandle"
  Name="dpanel"
  Button.Click="HandleClick"
>
  <StackPanel.Resources>
      <Style TargetType="{x:Type Button}">
        <Setter Property="Height" Value="20"/>
        <Setter Property="Width" Value="250"/>
        <Setter Property="HorizontalAlignment" Value="Left"/>
      </Style>
  </StackPanel.Resources>
  <Button Name="Button1">Item 1</Button>
  <Button Name="Button2">Item 2</Button>
  <TextBlock Name="results"/>
</StackPanel>

En el siguiente ejemplo se controla el evento Click. El ejemplo notifica qué elemento controla el evento y qué elemento genera el evento. El controlador de eventos se ejecuta cuando el usuario hace clic en cualquiera de los botones.

Private eventstr As New Text.StringBuilder()

Private Sub HandleClick(ByVal sender As Object, ByVal args As RoutedEventArgs)
    ' Get the element that handled the event.
    Dim fe As FrameworkElement = DirectCast(sender, FrameworkElement)
    eventstr.Append("Event handled by element named ")
    eventstr.Append(fe.Name)
    eventstr.Append(vbLf)

    ' Get the element that raised the event. 
    Dim fe2 As FrameworkElement = DirectCast(args.Source, FrameworkElement)
    eventstr.Append("Event originated from source element of type ")
    eventstr.Append(args.Source.[GetType]().ToString())
    eventstr.Append(" with Name ")
    eventstr.Append(fe2.Name)
    eventstr.Append(vbLf)

    ' Get the routing strategy.
    eventstr.Append("Event used routing strategy ")
    eventstr.Append(args.RoutedEvent.RoutingStrategy)
    eventstr.Append(vbLf)

    results.Text = eventstr.ToString()
End Sub
public partial class RoutedEventHandle : StackPanel
{
    StringBuilder eventstr = new StringBuilder();
    void HandleClick(object sender, RoutedEventArgs args)
    {
        // Get the element that handled the event.
        FrameworkElement fe = (FrameworkElement)sender;
        eventstr.Append("Event handled by element named ");
        eventstr.Append(fe.Name);
        eventstr.Append("\n");

        // Get the element that raised the event. 
        FrameworkElement fe2 = (FrameworkElement)args.Source;
        eventstr.Append("Event originated from source element of type ");
        eventstr.Append(args.Source.GetType().ToString());
        eventstr.Append(" with Name ");
        eventstr.Append(fe2.Name);
        eventstr.Append("\n");

        // Get the routing strategy.
        eventstr.Append("Event used routing strategy ");
        eventstr.Append(args.RoutedEvent.RoutingStrategy);
        eventstr.Append("\n");

        results.Text = eventstr.ToString();
    }
}

Vea también

Referencia

RoutedEvent

Conceptos

Información general sobre acciones del usuario

Información general sobre eventos enrutados

Detalles de la sintaxis XAML

Otros recursos

Temas "Cómo..." sobre eventos

Historial de cambios

Fecha

Historial

Motivo

Julio de 2010

Se ha agregado un ejemplo para el controlador de eventos.

Comentarios de los clientes.