Что такое WPF Preview Events?

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

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

Ответ 1

От программирования WPF - Chris Sells и Ian Griffith

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

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

например. если UI Tree = Кнопка содержит Grid содержит Canvas содержит Ellipse
Нажатие на эллипс приведет к тому, что (MouseDownButton будет съеден Button и Click поднят вместо.)

PreviewMouseDownButton
PreviewMouseDownGrid
PreviewMouseDownCanvas
PreviewMouseDownEllipse
MouseDownEllipse
MouseDownCanvas
MouseDownGrid

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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