Jak obsłużyć zdarzenie trasowane
W tym przykładzie pokazano, jak działają zdarzenia bubbling i jak napisać procedurę obsługi, która może przetwarzać kierowane dane zdarzenia.
Przykład
W programie Windows Presentation Foundation (WPF) elementy są rozmieszczone w strukturze drzewa elementów. Element nadrzędny może uczestniczyć w obsłudze zdarzeń, które są początkowo wywoływane przez elementy podrzędne w drzewie elementów. Jest to możliwe z powodu routingu zdarzeń.
Zdarzenia kierowane zwykle są zgodne z jedną z dwóch strategii routingu, bubbling lub tunneling. W tym przykładzie skupiono się na zdarzeniu bubbling i użyto ButtonBase.Click zdarzenia, aby pokazać, jak działa routing.
Poniższy przykład tworzy dwie Button kontrolki i używa składni atrybutów XAML w celu dołączenia procedury obsługi zdarzeń do wspólnego elementu nadrzędnego, który w tym przykładzie to StackPanel. Zamiast dołączać poszczególne programy obsługi zdarzeń dla każdego Button elementu podrzędnego, w przykładzie użyto składni atrybutów w celu dołączenia procedury obsługi zdarzeń do elementu nadrzędnego StackPanel . Ten wzorzec obsługi zdarzeń pokazuje, jak używać routingu zdarzeń jako techniki zmniejszania liczby elementów, w których jest dołączony program obsługi. Wszystkie zdarzenia bubbling dla każdej Button trasy przez element nadrzędny.
Należy pamiętać, Click że w elemecie nadrzędnym StackPanel nazwa zdarzenia określona jako atrybut jest częściowo kwalifikowana przez nazewnictwo Button klasy. Klasa Button jest klasą pochodną ButtonBase , która ma zdarzenie na Click liście jej składowych. Ta częściowa technika kwalifikacji do dołączania programu obsługi zdarzeń jest niezbędna, jeśli obsługiwane zdarzenie nie istnieje na liście elementów członkowskich, w których jest dołączony program obsługi zdarzeń kierowanych.
<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>
Poniższy przykład obsługuje Click zdarzenie. Przykład raportuje, który element obsługuje zdarzenie i który element zgłasza zdarzenie. Procedura obsługi zdarzeń jest wykonywana, gdy użytkownik kliknie dowolny przycisk.
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
Zobacz też
.NET Desktop feedback