Согласен, документация по пузырям / туннелированию на MSDN совсем не велика.
Я нашел эту статью в журнале MSDN "Понимание перенаправленных событий и команд в WPF" гораздо лучше объясняет всплывающие события.
Найдите раздел «Маршрутизация событий», копия вставлена ниже:
Event Routing
Понимание немного
о логических и визуальных деревьях
важно, потому что перенаправленные события получают
маршрутизируется в основном на основе визуального
дерево. Направленные события поддерживают
Стратегия маршрутизации пузыря, туннеля или
Прямая.
Пузырь является наиболее распространенным и
означает, что событие будет пузыриться
(распространять) вверх по визуальному дереву от
исходный элемент, пока он не будет
был обработан или доходит до корня
элемент. Это позволяет вам обрабатывать
событие на объекте далее вверх
иерархия элементов из источника
элемент. Например, вы можете прикрепить
обработчик Button.Click на
включающий элемент Grid вместо
прямо на самой кнопке. Пузырь
события просто имеют имена, которые указывают
их действие (например, MouseDown).
Туннельные события уходят в другие
направление, начиная с корня
элемент и прохождение вниз по
элемент дерева, пока они не будут обработаны или
достичь исходного элемента для
событие. Это позволяет вышестоящим элементам
перехватить событие и обработать его
до того, как событие достигнет источника
элемент. Туннельные события имеют свои
имена с префиксом Preview by
соглашение (например, PreviewMouseDown).
Прямые события ведут себя как обычно
события в .NET Framework. Единственный
потенциальный обработчик события
делегат, который подключен к
событие.
Обычно, если событие Tunnel
определенный для конкретного события, там
это соответствующее событие Bubble. В
в этом случае происходит событие Tunnel
во-первых, начиная с корня и
пробирается к источнику
элемент ищет обработчик. Однажды это
был обработан или достиг
Исходный элемент, событие Bubble
выстрелил, пробираясь от
исходный элемент и ищет
обработчик. Событие Bubble или Tunnel делает
не остановить свою маршрутизацию только потому, что
обработчик события называется. Если ты хочешь
чтобы прекратить пузыриться или туннелирование
процесс, вы помечаете событие как обработанное
в вашем обработчике событий, используя событие
аргументы вы передали:
private void OnChildElementMouseDown(object sender, MouseButtonEventArgs e) { e.Handled = true; }
Как только ваш обработчик помечает событие как
обрабатывается, он не будет поднят ни к одному
больше обработчиков. Ну это только
частично верно. На самом деле событие
маршрутизация продолжается за кулисами,
и вы можете явно подключить событие
обработчики в коде с переопределением
метод UIElement.AddHandler, который
имеет дополнительный флаг для эффективного
сказать: «Позвони мне, даже если событие
помечены как обработанные. "Вы указываете
этот флаг с вызовом, как
следующим образом:
m_SomeChildElement.AddHandler(UIElement.MouseDownEvent, (RoutedEventHandler)OnMouseDownCallMeAlways,true);
Первый параметр AddHandler
RoutedEvent, который вы хотите обработать.
Второй является делегатом
метод обработки событий (который потребуется
иметь правильную подпись для
делегат мероприятия). Третий параметр
указывает, хотите ли вы быть
даже если другой обработчик
пометил событие как обработанное.
элемент, на котором вы вызываете AddHandler
это тот, который будет следить за
событие для прохождения во время маршрутизации.
Надеюсь, это поможет.