Практическое руководство. Обработка перенаправленных событий
В этом примере описаны принципы действия всплывающих событий и способы написания обработчика, который может обрабатывать данные перенаправленных событий.
Пример
В Windows Presentation Foundation (WPF) элементы располагаются в структуре дерева элементов. Родительский элемент может участвовать в обработке событий, которые изначально вызываются его дочерними элементами в дереве элементов. Это возможно благодаря маршрутизации событий.
Перенаправленные события обычно следуют по одному из двух вариантов маршрутизации: восходящей или нисходящей. В этом примере основное внимание уделяется всплывающему событию и используется событие ButtonBase.Click, чтобы показать, как работает маршрутизация.
В следующем примере создаются два элемента управления Button и используется синтаксис атрибутов XAML для присоединения обработчика событий к общему родительскому элементу, которым в этом примере является элемент управления StackPanel. Вместо присоединения отдельных обработчиков событий для каждого дочернего элемента Button, в примере используется синтаксис атрибута для присоединения обработчика событий к родительскому элементу StackPanel. Этот шаблон обработки событий показывает, как использовать маршрутизирование событий для снижения числа элементов, к которым присоединен обработчик. Все всплывающие события для каждого маршрута Button направляются через родительский элемент.
Обратите внимание, что на родительском элементе StackPanel имя события Click, указанное в качестве атрибута, частично определяется с помощью указания класса Button. Класс Button является производным от класса ButtonBase, который содержит событие Click в своем списке членов. Этот метод частичного уточнения для присоединения обработчика событий необходим, если обрабатываемое событие не существует в списке членов элемента, к которому присоединен обработчик перенаправленных событий.
<StackPanel
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://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. В примере сообщается, какой элемент обрабатывает событие и какой элемент вызывает событие. Обработчик событий выполняется, когда пользователь нажимает одну из кнопок.
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
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();
}
}
См. также
Ссылки
Основные понятия
Общие сведения о входных данных
Общие сведения о перенаправленных событиях
Подробное описание синтаксиса XAML
Другие ресурсы
Разделы руководства, посвященные событиям
Журнал изменений
Дата |
Журнал |
Причина |
---|---|---|
Июль 2010 |
Добавлен пример обработчика событий. |
Обратная связь от клиента. |