Маршрутизация событий в WPF - PullRequest
       17

Маршрутизация событий в WPF

1 голос
/ 13 сентября 2010

Я реализовал UserControl. Затем я хотел бы обработать событие, которое изначально обрабатывается Window (нажатие клавиатуры). Как лучше всего маршрутизировать событие, перехваченное другим компонентом (выше в дереве компонентов)?

Заранее спасибо за ответы и подсказки!

Приветствия

Ответы [ 3 ]

1 голос
/ 13 сентября 2010

Это зависит от события, к которому вы пытаетесь получить доступ. Если это событие Preview, и Window устанавливает e.Handled на true, вам нужно использовать метод, который Алекс предлагает, чтобы обойти обработку Window туннелирования. Если это пузырьковое событие (т.е. KeyDown), вам не нужно делать ничего особенного, так как пузырьковые события сначала попадают на обработчики дочерних элементов и поднимаются по визуальному дереву, поэтому обработчик Window не будет работать до тех пор, пока не будут выполнены ваши UC.

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

0 голосов
/ 13 сентября 2010

Вы можете прикрепить маршрутизируемый обработчик, указав, что вы также хотите обрабатывать обработанные сообщения:

this.AddHandler(routedEvent, handler, true);

где this - UIElement или производный класс.

Однако могут быть события (нажатия клавиш в этом случае), которые не проходят через окно, не уверен.

0 голосов
/ 13 сентября 2010

Я верю, что вы не можете это гарантировать.Класс Window переносит модель событий на основе сообщений Win32, и это будет единственная сущность WPF, которая будет иметь доступ к этой информации.

Я предлагаю создать присоединенное свойство (которое будет использоваться Window) и самостоятельно осуществите маршрутизацию событий, чтобы элементы управления могли подписаться на них.

...