Cómo: Controlar un evento enrutado

En este ejemplo se muestra cómo funciona la propagación de eventos y cómo se escribe un controlador capaz de procesar los datos de eventos enrutados.

Ejemplo

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

Normalmente, los eventos enrutados siguen una de las dos estrategias de enrutamiento posibles: propagación o tunelización. Este ejemplo se centra en el evento de propagación y usa el evento ButtonBase.Click para mostrar cómo funciona el enrutamiento.

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

Tenga en cuenta que en el elemento principal StackPanel, el nombre del evento especificado como atributo Click está parcialmente calificado por el nombre de clase Button. La clase Button es una clase derivada ButtonBase que tiene el evento Click en el listado de miembros. Esta técnica de calificación parcial para adjuntar un controlador de eventos es necesaria si el evento que se controla no existe en la lista de miembros del elemento donde está adjunto el controlador de eventos enrutados.

<StackPanel
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://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 ejemplo siguiente, se controla el evento Click. En el ejemplo se notifican el elemento que controla el evento y el elemento que lo genera. El controlador de eventos se ejecuta cuando el usuario hace clic en cualquiera de los botones.

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();
    }
}
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

Vea también