Туннелирование WPF, практическое использование? - PullRequest
6 голосов
/ 08 июля 2011

В каких практических сценариях необходимо использовать туннелирование событий?

Я знаю, что расплывчатым ответом на этот вопрос может быть то, что он используется, когда мы хотим обработать событие в визуальном / логическом элементе, для которого возникает событие.Но это только теория.

На практике, почему я должен туннелировать событие?

Также работает туннелирование (и пузыри) по логическому дереву или дереву визуалов или обоим?

Ответы [ 4 ]

8 голосов
/ 08 июля 2011

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

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

4 голосов
/ 08 июля 2011

Туннельные события используются в WPF для всех событий OnPreview. Туннелирование имеет смысл, если вы хотите, чтобы фактический целевой элемент был последним, получившим событие.

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

Msdn:

Туннелирование: изначально обработчики событий в корне дерева элемента вызываются. Затем перенаправленное событие проходит маршрут через последовательные дочерние элементы по маршруту, к узлу элемент, который является перенаправленным событием источник (элемент, который поднял перенаправленное событие). Туннелирование маршрутизируемых событий часто используются или обрабатываются как часть композитинг для контроля, такой что события из составных частей могут быть умышленно подавленным или замененным событиями, которые являются специфическими для полный контроль Входные события предоставляемые в WPF часто приходят реализованы как туннельная / пузырящаяся пара. Туннельные события также иногда упоминается как Предварительный просмотр событий, потому что соглашения об именах, которое используется для пар.

AFAIK. Визуальное дерево используется для обхода, но поскольку MSDN не работает, я не могу найти подходящий источник.

3 голосов
/ 08 июля 2011

Это цитата из MSDN :

Туннелирование: Изначально вызывались обработчики событий в корне дерева элементов.Затем перенаправленное событие проходит маршрут через последовательные дочерние элементы вдоль маршрута к элементу узла, который является источником перенаправленного события (элемент, вызвавший перенаправленное событие).Туннелирование перенаправленных событий часто используется или обрабатывается как часть составления для элемента управления, так что события из составных частей могут быть преднамеренно подавлены или заменены событиями, характерными для всего элемента управления.Входные события, предоставляемые в WPF, часто реализуются как пара туннелирования / пузыри.События туннелирования также иногда называют событиями предварительного просмотра из-за соглашения об именах, которое используется для пар.

Туннелирование событий - это то, что обычно известно как Preview -События.

enter image description here

Возможно, вы также захотите прочитать эту статью MSDN по Расширенный WPF: понимание маршрутизируемых событий и команд в WPF .@Robert Havery написал хорошее объяснение к подобному вопросу здесь на SO.

1 голос
/ 08 июля 2011

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

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

...