Ну, в основном RoutedEvent
проходит через дерево Logical
, либо от исходного элемента к корневому элементу (Bubble
маршрут события), либо реже от корневого элемента к элементам подуровней (Tunnel
маршрут события ). Это означает, что если у вас есть Button
внутри StackPanel
, то это само по себе внутри Grid
; если вы определяете событие Click
в элементах управления, все они будут вызывать его, если только один из них не обработает его.
Если маршрут события Bubble
(назван как обычное событие Click
), он будет идти:
Button -> StackPanel -> Grid
Если маршрут события Tunnel
(с именем PreviewClick
), он будет идти наоборот:
Grid -> StackPanel -> Button
Так что теперь с обработкой все довольно просто. Если это маршрут Bubble
и Button
устанавливает RoutedEventArgs.Handled
в значение true, то StackPanel
и Grid
не сработают. То же самое с RoutedEvent
, если Grid
обрабатывает его, StackPanel
и Button
не сработают.
Это мое понимание в двух словах, я упустил некоторые вещи для простоты.
Я рекомендую эту главу для лучшего понимания этой функции WPF.