Hoe te: Een geroutede gebeurtenis afhandelen
In dit voorbeeld ziet u hoe bubblinggebeurtenissen werken en hoe u een handler schrijft waarmee de gerouteerde gebeurtenisgegevens kunnen worden verwerkt.
Voorbeeld
In Windows Presentation Foundation (WPF) worden elementen gerangschikt in een elementenboomstructuur. Het bovenliggende element kan deelnemen aan de verwerking van gebeurtenissen die in eerste instantie worden gegenereerd door onderliggende elementen in de elementstructuur. Dit is mogelijk vanwege gebeurtenisroutering.
Gerouteerde gebeurtenissen volgen doorgaans een van de twee routeringsstrategieën, bubbling of tunneling. Dit voorbeeld is gericht op de bubbling-gebeurtenis en gebruikt de ButtonBase.Click gebeurtenis om te laten zien hoe routering werkt.
In het volgende voorbeeld worden twee Button-besturingselementen gemaakt en wordt de XAML-attribuutsyntaxis gebruikt om een gebeurtenishandler te koppelen aan een gemeenschappelijk bovenliggend element, wat in dit voorbeeld StackPanelis. In plaats van afzonderlijke gebeurtenis-handlers voor elk Button onderliggend element te koppelen, gebruikt het voorbeeld de syntaxis van het kenmerk om de gebeurtenis-handler te koppelen aan het StackPanel bovenliggende element. Dit patroon voor gebeurtenisafhandeling laat zien hoe u gebeurtenisroutering kunt gebruiken als techniek voor het verminderen van het aantal elementen waaraan een handler is gekoppeld. Alle bubbelende gebeurtenissen voor elke Button banen zich een weg door het bovenliggende element.
Houd er rekening mee dat op het bovenliggende StackPanel element de Click gebeurtenisnaam die is opgegeven als het kenmerk gedeeltelijk is gekwalificeerd door de naam van de Button-klasse te benoemen. De Button-klasse is een van ButtonBase afgeleide klasse die de Click gebeurtenis in zijn ledenlijst heeft. Deze gedeeltelijke kwalificatietechniek voor het koppelen van een eventhandler is nodig als de gebeurtenis die wordt verwerkt niet bestaat in het ledenoverzicht van het element waar de gerouteerde eventhandler is gekoppeld.
<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>
In het volgende voorbeeld wordt de Click gebeurtenis verwerkt. In het voorbeeld wordt gerapporteerd welk element de gebeurtenis verwerkt en welk element de gebeurtenis genereert. De gebeurtenis-handler wordt uitgevoerd wanneer de gebruiker op een van de knoppen klikt.
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
Zie ook
.NET Desktop feedback