Freigeben über


Vorgehensweise: Behandeln eines Routingereignisses

In diesem Beispiel wird gezeigt, wie Bubbling-Ereignisse funktionieren und wie ein Handler geschrieben wird, der die Routingereignisdaten verarbeiten kann.

Beispiel

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

Routingereignisse folgen in der Regel einer von zwei Routingstrategien, Bubbling oder Tunneling. Dieses Beispiel konzentriert sich auf das Bubbling-Ereignis und verwendet das ButtonBase.Click Ereignis, um zu zeigen, wie Routing funktioniert.

Im folgenden Beispiel werden zwei Button Steuerelemente erstellt und die XAML-Attributsyntax verwendet, um einen Ereignishandler an ein allgemeines übergeordnetes Element anzufügen, das in diesem Beispiel lautet StackPanel. Anstatt einzelne Ereignishandler für jedes Button untergeordnete Element anzufügen, verwendet das Beispiel attributsyntax, um den Ereignishandler an das StackPanel übergeordnete Element anzufügen. Dieses Ereignisbehandlungsmuster zeigt, wie Sie das Ereignisrouting als Verfahren zum Verringern der Anzahl von Elementen verwenden, an die ein Handler angefügt ist. Alle Bubbling-Ereignisse für jeden Button leiten durch das übergeordnete Element.

Beachten Sie, dass der als Attribut angegebene Ereignisname im übergeordneten StackPanel-Element teilweise durch die Benennung der Click-Klasse spezifiziert ist. Die Button Klasse ist eine von ButtonBase abgeleitete Klasse, und enthält das Click Ereignis unter ihren Mitgliedern. Diese partielle Qualifizierungsmethode zum Anfügen eines Ereignishandlers ist erforderlich, wenn das behandelte Ereignis nicht in der Memberauflistung 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. Das Beispiel meldet, welches Element das Ereignis behandelt und welches Element das Ereignis auslöst. Der Ereignishandler wird ausgeführt, wenn der Benutzer auf eine der Schaltflächen 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

Siehe auch