Anvisningar: Hantera en dirigerad händelse
Det här exemplet visar hur bubblande händelser fungerar och hur du skriver en hanterare som kan bearbeta routade händelsedata.
Exempel
I Windows Presentation Foundation (WPF) ordnas elementen i en elementträdstruktur. Det överordnade elementet kan delta i hanteringen av händelser som ursprungligen genereras av underordnade element i elementträdet. Detta är möjligt tack vare routning av händelser.
Routade händelser följer vanligtvis en av två strategier för dirigering, bubblande eller tunnling. Det här exemplet fokuserar på den bubblande händelsen och använder händelsen ButtonBase.Click för att visa hur routning fungerar.
I följande exempel skapas två Button kontroller och XAML-attributsyntax används för att koppla en händelsehanterare till ett gemensamt överordnat element, vilket i det här exemplet är StackPanel. I stället för att koppla enskilda händelsehanterare för varje Button underordnat element använder exemplet attributsyntax för att koppla händelsehanteraren till det StackPanel överordnade elementet. Det här händelsehanteringsmönstret visar hur du använder händelseroutning som en teknik för att minska antalet element där en hanterare är ansluten. Alla bubblande händelser för varje Button väg genom det överordnade elementet.
Observera att på det överordnade StackPanel-elementet är det Click händelsenamn som anges som attribut delvis kvalificerat genom att namnge klassen Button. Klassen Button är en ButtonBase härledd klass som har händelsen Click i medlemsförteckningen. Den här partiella kvalificeringstekniken för att koppla en händelsehanterare är nödvändig om händelsen som hanteras inte finns i medlemslistan för elementet där den dirigerade händelsehanteraren är kopplad.
<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>
I följande exempel hanteras händelsen Click. Exemplet rapporterar vilket element som hanterar händelsen och vilket element som genererar händelsen. Händelsehanteraren körs när användaren klickar på någon av knapparna.
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
Se även
.NET Desktop feedback