Практическое руководство. Обработка перенаправленных событий
В этом примере показаны принципы работы восходящей маршрутизации событий и создания обработчика, который может обрабатывать данные перенаправленных событий.
Пример
В Windows Presentation Foundation (WPF) элементы упорядочены в структуру типа "дерево элементов". Родительский элемент может участвовать в обработке событий, которые изначально вызываются его дочерними элементами в дереве элементов. Это становится возможным из-за маршрутизации событий.
Перенаправленные события обычно обрабатываются с использованием одной из двух стратегий маршрутизации: восходящей или нисходящей. В этом примере рассматривается событие восходящей маршрутизации и использует ButtonBase.Click событие, чтобы показать, как работает маршрутизация.
В следующем примере создается два Button определяет и использует XAML синтаксис для присоединения обработчика событий к стандартному родительскому элементу, который в данном примере — атрибута StackPanel. Вместо того чтобы прикреплять отдельные обработчики событий для каждого Button дочерний элемент, в примере используется синтаксис атрибутов для прикрепления обработчика событий к StackPanel родительского элемента. Этот шаблон обработки событий показывает, как использовать маршрутизацию событий в качестве техники для уменьшения количества элементов, к которым прикреплен обработчик. Все события восходящей маршрутизации для каждого Button маршрутов через родительский элемент.
Обратите внимание, что в родительском StackPanel элемент, Click имя события, указанные в виде атрибута, частично определяется путем именования Button класса. Button Класс является ButtonBase производным классом, имеющим Click событие в списке его участников. Необходимо использовать этот метод частичного определения для прикрепления обработчика событий, если обрабатываемое событие не существует в списке участников элемента, к которому прикреплен обработчик перенаправленного события.
<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>
В следующем примере показана обработка Click событий. В этом примере сообщается, какой элемент обрабатывает событие, а какой — вызывает. Обработчик событий выполняется, когда пользователь нажимает одну из кнопок.
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();
}
}