Partilhar via


Como: Manipular um Evento Encaminhado

Este exemplo mostra como os eventos borbulhantes funcionam e como escrever um manipulador que pode processar os dados de eventos roteados.

Exemplo

No Windows Presentation Foundation (WPF), os elementos são organizados em uma estrutura de árvore de elementos. O elemento pai pode participar da manipulação de eventos que são inicialmente gerados por elementos filho na árvore de elementos. Isso é possível devido ao roteamento de eventos.

Os eventos roteados normalmente seguem uma das duas estratégias de roteamento, borbulhar ou tunelamento. Este exemplo se concentra no evento borbulhante e usa o evento ButtonBase.Click para mostrar como o roteamento funciona.

O exemplo a seguir cria dois controles Button e usa sintaxe de atributo XAML para anexar um manipulador de eventos a um elemento pai comum, que neste exemplo é StackPanel. Em vez de anexar manipuladores de eventos individuais para cada elemento filho Button, o exemplo usa sintaxe de atributo para anexar o manipulador de eventos ao elemento pai StackPanel. Esse padrão de manipulação de eventos mostra como usar o roteamento de eventos como uma técnica para reduzir o número de elementos nos quais um manipulador está anexado. Todos os eventos borbulhantes para cada Button rota através do elemento pai.

Observe que no elemento StackPanel pai, o nome do evento Click especificado como o atributo é parcialmente qualificado nomeando a classe Button. A classe Button é uma classe derivada de ButtonBase que tem o evento Click em sua listagem de membros. Essa técnica de qualificação parcial para anexar um manipulador de eventos será necessária se o evento que está sendo manipulado não existir na listagem de membros do elemento onde o manipulador de eventos roteado está anexado.

<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>

O exemplo a seguir manipula o evento Click. O exemplo relata qual elemento manipula o evento e qual elemento gera o evento. O manipulador de eventos é executado quando o usuário clica em qualquer um dos botões.

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

Ver também