Что такое события предварительного просмотра WPF?


Я искал описания событий " Preview******", как и каждый элемент имеет события KeyDown и PreviewKeyDown. В чем разница (не то, что одно прикрепленное событие, а другое нет, реальная обычная разница и разница в способе программирования)

в любом классе, производном от Control, можно переопределить оба метода.. OnKeyDown и OnPreviewKeyDown, теперь я пишу свой пользовательский элемент управления, какой метод я должен использовать? И какая разница между ними.

4 66

4 ответа:

от программирования WPF-Крис Селлс и Ян Гриффит

за исключением прямых событий, WPF определяет большинство маршрутизируемых событий в пары-одно туннелирование и другое пузырящийся. Имя события туннелирования всегда начинается с 'Preview' и является поднял первым. Это дает родителям возможность увидеть событие до него доходит до ребенка. Далее пузырящийся двойник. В большинстве случаи, вы будете обрабатывать только пузырящийся один. В окне предварительного просмотра будет быть обычно используется для

  • событие (e.Handled = true)
  • заставьте родителя сделать что-то заранее для нормальной обработки событий.

например, если дерево UI = кнопка содержит сетку содержит холст содержит эллипс
Щелчок по эллипсу приведет к тому, что (MouseDownButton съедается кнопкой и вместо этого поднимается щелчок.)

PreviewMouseDownButton
PreviewMouseDownGrid
PreviewMouseDownCanvas
PreviewMouseDownEllipse
MouseDownEllipse
MouseDownCanvas
MouseDownGrid

Я нашел эту запись в блоге очень полезной в описании разницы:

http://joshsmithonwpf.wordpress.com/2007/06/22/overview-of-routed-events-in-wpf/

У вас есть визуальное дерево, когда событие происходит на элементе в дереве, сначала событие предварительного просмотра будет перемещаться из корня в элемент (туннелирование): событие PreviewKeyDown будет возникать на всех этих элементах, а затем" нормальное " событие будет перемещаться из элемента в корень (пузырящийся.)

в принципе, это то же самое событие, но происходит прямо перед главным событием. Они существуют, поэтому вы можете прослушивать эти типы событий, не вмешиваясь в нормальное поведение элемента управления, когда эти события происходят.

например, кнопки делают вещи, когда вы нажимаете или MouseEnter и т. д. Если вы сами справляетесь с этими событиями, вы должны убедиться, что делаете то же самое, иначе ваша кнопка не будет действовать одинаково. События предварительного просмотра дают вам событие в той же временной шкале без приходится беспокоиться о возиться с существующей функциональностью.

Это особенно полезно при работе с пользовательскими стилями / триггерами / шаблонами управления. Когда вы начинаете переопределять внешний вид/поведение элемента управления.

Итак, в вашем управлении, сделайте основную работу, которую вы хотите в событии OnKeyDown, и оставьте событие предварительного просмотра для кого-то другого, как я работаю с ними.

Это различие связано с маршрутизируемыми событиями, и именно так WPF реализует свою стратегию обработки событий. Стандартное имя события (например, KeyDown и т. д.) подразумевает пузырящуюся стратегию маршрутизации. Те, которые предваряются "Preview" (т. е. PreviewKeyDown и т. д.) предполагает стратегию маршрутизации, туннелирования. Вы можете прочитать об этих стратегиях более подробно здесь. В принципе, когда событие в WPF вызывается, оно сначала перемещается от самого верхнего элемента вниз по визуальному дереву к элементу это вызвало событие и, наконец, возвращается вверх. На пути вниз по дереву вы столкнетесь с событием PreviewKeyDown, а на обратном пути вы столкнетесь с событием KeyDown в этом порядке.