RoutedEventArgs против EventArgs
Я изучаю WPF/Silverlight и видел в MS vidcast, что теперь рекомендуется использовать RoutedEventArgs
over EventArgs
; хотя он не сказал точно, почему.
У меня есть приложение для форм win, которое использует интерфейсы для "виджетов" в попытке не привязываться к определенной технологии отображения (в презентациях/просмотренных моделях), поэтому, если моему событию IButton Click сейчас нужно взять RoutedEventArgs
сейчас Думаю, это не так полезно.
Может кто-нибудь объяснит, нужно ли мне переключаться на RoutedEventArgs
во всех случаях и почему?
Как в стороне, есть ли у кого-нибудь еще опыт/мнения об использовании виджетов интерфейса, как я их описываю?
Ответы
Ответ 1
Ну, в основном 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.
Ответ 2
RoutedEventArgs - это новый аргумент события, который существует для поддержки WPF-модели eventing: Routed Events. Трудно объяснить в короткой статье, почему именно WPF выбрал эту модель или что это такое, поэтому я начну с указания хорошей статьи по этому вопросу.
Ответ 3
Скажем, у нас есть элемент Button, содержащий другие элементы, StackPanel, сам содержащий TextBox и элемент Image.
Элемент Button должен иметь возможность обрабатывать событие клика независимо от того, было ли нажато изображение или текстовый блок.
Следовательно, WPF предоставляет способ:
- Распространение события через дерево элементов в течение большей части времени
от исходного элемента (здесь говорят изображение), до более высокого уровня к корневому элементу (например, здесь кнопка).
- Обрабатывать такое распространенное событие.