Маршрутизируемые события (routed events) – модель событий WPF, созданная для использования в дереве визуальных элементов. При генерации маршрутизируемого события информация о нём может быть передана как родительским, так и дочерним элементам источника событий.
Реализация и использование маршрутизируемых событий имеет много общего со свойствами зависимостей. Рассмотрим в качестве примера реализацию события Click в стандартном элементе управления Button:
public class Button: ButtonBase
{
// статическое поле для маршрутизируемого события
public static RoutedEvent ClickEvent =
EventManager.RegisterRoutedEvent("Click",
RoutingStrategy.Bubble,
typeof (RoutedEventHandler),
typeof (Button));
// экземплярная оболочка события
public event RoutedEventHandler Click
{
add { AddHandler(ClickEvent, value); }
remove { RemoveHandler(ClickEvent, value); }
}
// внутренний метод для генерации события
protected override void OnClick(EventArgs e)
{
RaiseEvent(new RoutedEventArgs(ClickEvent, this));
}
}
Методы AddHandler(), RemoveHandler() и RaiseEvent() – это методы класса UIElement. Листинг показывает, что при регистрации маршрутизируемого события используется метод EventManager.RegisterRoutedEvent(). Одним из аргументов метода является элемент перечисления RoutingStrategy, описывающего стратегию маршрутизации события:
|
|
Tunnel – событие генерируется в корневом элементе, затем в каждом дочернем элементе, пока не достигает элемента-источника.
Bubble – событие генерируется в элементе источнике, затем в каждом родительском элементе, вплоть до корня дерева элементов.
Direct – событие генерируется только в элементе-источнике.
Обработчики маршрутизируемых событий принимают аргумент RoutedEventArgs. Этот класс содержит следующие свойства: Source – источник события в логическом дереве элементов; Handled – при установке в true маршрутизации события в дереве прекращается; RoutedEvent – объект, описывающий маршрутизируемое событие.
Класс UIElement определяет множество маршрутизируемых событий, связанных с клавиатурой, мышью, стилусом. Большинство событий используют Bubble-стратегию. Многие Bubble-события имеют сопряжённое Tunnel-событие, которое генерируется перед Bubble-событием (Tunnel-событие отличает префикс Preview в названии).