Что такое предварительные события WPF? - PullRequest
72 голосов
/ 22 сентября 2009

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

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

Ответы [ 4 ]

115 голосов
/ 22 сентября 2009

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

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

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

например. если пользовательский интерфейс Tree = кнопка содержит Grid содержит Canvas содержит Ellipse
Нажатие на эллипс приведет к (MouseDownButton съедается Button, а Click повышается.)

PreviewMouseDownButton
PreviewMouseDownGrid
PreviewMouseDownCanvas
PreviewMouseDownEllipse
MouseDownEllipse
MouseDownCanvas
MouseDownGrid
8 голосов
/ 22 сентября 2009

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

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

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

3 голосов
/ 22 сентября 2009

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

3 голосов
/ 22 сентября 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...