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í události ButtonBase.Click 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 ke společnému nadřazenému elementu, který v tomto příkladu je StackPanel. Namísto připojení jednotlivých obslužných rutin událostí pro každý Button podřízený element, příklad využívá syntaxi atributu k připojení obslužné rutiny události k StackPanel nadřazený element. 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 bublající události pro každou instanci Button prochází přes nadřazený prvek.
Všimněte si, že u nadřazeného StackPanel elementu Click název události zadaný jako atribut je částečně kvalifikovaný pojmenováním Button třídy. Třída Button je odvozená z třídy ButtonBase a má událost Click ve výčtu č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á událost Click. Ukázková zpráva, která uvádí, který prvek zpracovává událost a který prvek událost vyvolává. 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é
.NET Desktop feedback