Postupy: Zpracování směrované události

Tento příklad ukazuje, jak bublinové události fungují a jak napsat obslužnou rutinu, která může zpracovávat směrovaná data událostí.

Příklad

Ve Windows Presentation Foundation (WPF) jsou prvky uspořádány do struktury stromu prvků. Nadřazený prvek se může účastnit zpracování událostí, které jsou původně vyvolány podřízenými prvky ve stromu elementů. To je možné kvůli směrování událostí.

Směrované události obvykle dodržují jednu ze dvou strategií směrování, bublání nebo tunelování. Tento příklad se zaměřuje na událost bublání a pomocí ButtonBase.Click události ukazuje, jak směrování funguje.

Následující příklad vytvoří dva Button ovládací prvky a pomocí syntaxe atributu XAML připojí obslužnou rutinu události ke společnému nadřazeného prvku, který v tomto příkladu je StackPanel. Místo připojení jednotlivých obslužných rutin událostí pro každý Button podřízený prvek příklad používá syntaxi atributu k připojení obslužné rutiny události k nadřazeného elementu StackPanel . Tento model zpracování událostí ukazuje, jak použít směrování událostí jako techniku ke snížení počtu prvků, ke kterému je připojena obslužná rutina. Všechny události bublání pro každou Button trasu přes nadřazený prvek.

Všimněte si, že u nadřazeného StackPanel elementu Click je název události zadaný jako atribut částečně kvalifikovaný pojmenováním Button třídy. Třída Button je odvozená ButtonBase třída, která má Click událost ve svém seznamu členů. Tato technika částečné kvalifikace pro připojení obslužné rutiny události je nezbytná, pokud událost, která je zpracována, neexistuje ve výpisu členů prvku, kde je připojena směrovaná obslužná rutina události.

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

Následující příklad zpracovává Click událost. Příklad sestavy, který prvek zpracovává událost a který prvek vyvolá událost. Obslužná rutina události se spustí, když uživatel klikne na tlačítko.

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

Viz také