Compartir a través de


Cómo: Controlar un evento enrutado

En este ejemplo se muestra cómo funcionan los eventos de propagación y cómo escribir un controlador que puede 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 debido al enrutamiento de eventos.

Los eventos enrutados normalmente siguen una de dos estrategias de enrutamiento: burbujeo o túnel. Este ejemplo se centra en el evento de burbujeo y utiliza el evento ButtonBase.Click para mostrar cómo funciona el enrutamiento.

En el ejemplo siguiente se crean dos Button controles y se usa la sintaxis de atributo XAML para adjuntar un controlador de eventos a un elemento primario común, que en este ejemplo es StackPanel. En lugar de adjuntar controladores de eventos individuales para cada Button elemento secundario, en el ejemplo se usa la sintaxis de atributo para adjuntar el controlador de eventos al StackPanel elemento primario. 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 burbujeantes de cada Button ruta pasan a través del elemento padre.

Tenga en cuenta que, en el elemento primario StackPanel, el nombre del evento Click especificado como atributo está parcialmente calificado mediante la nomenclatura de la clase Button. La Button clase es una ButtonBase clase derivada que tiene el Click evento en su lista 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 en el que se adjunta el controlador de eventos enrutado.

<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 maneja el evento Click. En el ejemplo se 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.

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

Consulte también