Gewusst wie: Behandeln eines Routingereignisses

Dieses Beispiel zeigt, wie Bubbling-Ereignisse funktionieren, und wie Sie einen Handler schreiben, der die Routingereignisdaten verarbeiten kann.

Beispiel

In Windows Presentation Foundation (WPF) werden Elemente in einer Elementstruktur angeordnet. Bei der Verarbeitung von Ereignissen, die ursprünglich von untergeordneten Elementen in der Elementstruktur ausgelöst werden, kann das übergeordnete Element teilnehmen. Dies ist durch das Ereignisrouting möglich.

Routingereignisse verfolgen normalerweise eine der folgenden Routingstrategien: Bubbling oder Tunneln. Dieses Beispiels konzentriert sich auf das Bubbling-Ereignis und verwendet das ButtonBase.Click-Ereignis, um zu zeigen, wie Routing funktioniert.

Das folgende Beispiel erstellt zwei Button-Steuerelemente und verwendet die -Attributsyntax, um einen Ereignishandler einem gemeinsamen übergeordneten Element anzufügen, das in diesem Beispiel StackPanel ist. Anstatt einzelne Ereignishandler für jedes untergeordnete Button-Element anzufügen, verwendet das Beispiel eine Attributsyntax, um den Ereignishandler an das übergeordnete StackPanel-Element anzufügen. Dieses Muster für die Ereignisbehandlung veranschaulicht, wie das Ereignisrouting als Verfahren zum Reduzieren der Anzahl der Elemente verwendet wird, bei denen ein Handler angefügt ist. Alle Bubbling-Ereignisse für jedes Button werden durch das übergeordnete Element weitergeleitet.

Beachten Sie, dass für das übergeordnete StackPanel-Element der als das Attribut angegebene Click-Ereignisname teilweise durch das Benennen der Button-Klasse qualifiziert wird. Die Button-Klasse ist eine von abgeleitete ButtonBase-Klasse, in deren Memberliste das Click-Ereignis vorhanden ist. Diese Teilqualifizierungsmethode zum Anfügen eines Ereignishandlers ist erforderlich, wenn das behandelte Ereignis nicht in der Memberliste des Elements vorhanden ist, an das der Routingereignishandler angefügt ist.

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

Im folgenden Beispiel wird das Click-Ereignis verarbeitet. Im Beispiel wird gemeldet, welches Element das Ereignis behandelt und welches Element das Ereignis auslöst. Der Ereignishandler wird ausgeführt, wenn der Benutzer auf eine Schaltfläche klickt.

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

Weitere Informationen