Що таке події попереднього перегляду WPF?


79

Я шукав описи подій "Preview ******", як кожен елемент має події KeyDown і PreviewKeyDown. Що таке різниця (не в тому, що до одного додається подія, а до іншого ні, реальна звичайна різниця та різниця між способами програмування)

У будь-якому класі, похідному від Control, ви можете замінити обидва методи .. OnKeyDown і OnPreviewKeyDown, зараз я пишу свій власний контроль, який метод використовувати? І яка різниця між ними обома.

Відповіді:


126

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

За винятком прямих подій, WPF визначає більшість маршрутизованих подій попарно - одне тунелювання, а інше - бульбашки. Назва тунельної події завжди починається з "Попередній перегляд" і піднімається першою. Це дає батькам можливість побачити подію ще до її досягнення дитиною. Далі йде барботажний аналог. У більшості випадків ви впораєтеся лише з бульбашкою. Попередній перегляд зазвичай звик

  • заблокувати подію ( e.Handled = true)
  • змусити батьків зробити щось заздалегідь до нормальної обробки подій.

наприклад, якщо дерево інтерфейсу користувача = Кнопка містить Сітка містить Полотно містить Еліпс,
натискання на еліпс призведе до (MouseDownButton з’їдається кнопкою, а замість цього натискається кнопка).

PreviewMouseDownButton
PreviewMouseDownGrid
PreviewMouseDownCanvas
PreviewMouseDownEllipse
MouseDownEllipse
MouseDownCanvas
MouseDownGrid

Дякую, я все переглядав у MSDN, але не знайшов, я читав усіх, хто говорив про бульбашки та тунелювання, але ця піксельність тексту всюди бракувала.
Akash Kava

9

Я знайшов цей запис у блозі дійсно корисним для опису різниці:

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

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


3

В основному, це одна і та ж подія, але відбувається безпосередньо перед основною подією. Вони існують, тому ви можете прослуховувати події такого типу, не втручаючись у нормальну поведінку елемента керування, коли ці події відбуваються.

Наприклад, кнопки роблять щось, коли Ви натискаєте, MouseEnter і т. Д. Якщо Ви обробляєте ці події самостійно, Ви повинні переконатися, що робите те саме, інакше Ваша кнопка не буде діяти однаково. Події попереднього перегляду дають вам подію в тій самій часовій шкалі, не турбуючись про те, щоб зіпсувати існуючі функції.

Це особливо корисно при роботі зі спеціальними стилями / тригерами / шаблонами управління. Коли ви починаєте замінювати зовнішній вигляд / поведінку управління.

Отже, у вашому Control, виконайте основну роботу, яку ви хочете в події OnKeyDown, і залиште подію попереднього перегляду для використання кимось іншим - це те, як я працюю з ними.


3

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.