Gewusst wie: Behandeln eines Routingereignisses

Dieses Beispiel zeigt die Funktionsweise von Bubbling-Ereignissen und das Schreiben eines Handlers, der die Daten des Routingereignisses verarbeiten kann.

Beispiel

In Windows Presentation Foundation (WPF) werden Elemente in einer Elementstruktur angeordnet. Das übergeordnete Element kann sich an der Behandlung von Ereignissen beteiligen, die ursprünglich von untergeordneten Elementen in der Elementstruktur ausgelöst wurden. Dies ist aufgrund des Ereignisroutings möglich.

Routingereignisse verfolgen normalerweise eine der folgenden Routingstrategien: Bubbling oder Tunneling. In diesem Beispiel wird das Bubbling-Ereignis und das ButtonBase.Click-Ereignis verwendet, um das Routing zu verdeutlichen.

Im folgenden Beispiel werden zwei Button-Steuerelemente erstellt, und die XAML-Attributsyntax wird verwendet, um einen Ereignishandler an ein gemeinsames übergeordnetes Element anzufügen (in diesem Beispiel StackPanel). Anstatt einzelne Ereignishandler für jedes untergeordnete Button-Element anzufügen, wird im Beispiel die Attributsyntax verwendet, um den Ereignishandler dem übergeordneten StackPanel-Element hinzuzufügen. Dieses Ereignisbehandlungsmuster zeigt, wie Sie das Ereignisrouting als Verfahren zum Reduzieren der Anzahl an Elementen verwenden, an die ein Handler angefügt wurde. Alle Bubbling-Ereignisse für die einzelnen Button-Elemente werden über das übergeordnete Element geroutet.

Beachten Sie, dass für das übergeordnete StackPanel-Element der als Attribut angegebene Click-Ereignisname teilweise qualifiziert wird, indem die Button-Klasse benannt wird. Die Button-Klasse ist eine von ButtonBase abgeleitete Klasse, deren Memberauflistung über das Click-Ereignis verfügt. Dieses Teilqualifikationsverfahren zum Anfügen eines Ereignishandlers ist erforderlich, wenn das behandelte Ereignis in der Memberauflistung des Elements nicht vorhanden ist, an das der Routingereignishandler angefügt ist.

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

Im folgenden Beispiel wird das Click-Ereignis behandelt. Das Beispiel zeigt, 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.

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

Siehe auch

Referenz

RoutedEvent

Konzepte

Übersicht über die Eingabe

Übersicht über Routingereignisse

Ausführliche Erläuterung der XAML-Syntax

Weitere Ressourcen

Gewusst-wie-Themen zu Ereignissen

Änderungsprotokoll

Datum

Versionsgeschichte

Grund

Juli 2010

Ein Beispiel für den Ereignishandler wurde hinzugefügt.

Kundenfeedback.