События предварительного просмотра

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

Предварительный просмотр событий и ввода

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

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

Дополнительные сведения об обработке классов и их связи с событиями предварительного просмотра см. в статье Маркировка перенаправленных событий как обработанных и обработка классов.

Обход скрытия события элементами управления

Один из сценариев, в котором обычно используются события предварительного просмотра — это обработка событий ввода составным элементом управления. Иногда автор элемента управления подавляет создание определенного события в своем элементе управления; возможно, это делается для замены определяемого компонентом события, которое содержит дополнительные сведения или предполагает более конкретное поведение. Например, Windows Presentation Foundation (WPF) Button подавляет события восходящей маршрутизации событий MouseLeftButtonDown и MouseRightButtonDown, активированных Button или его составными элементами и вместо них выполняет захват мыши и активирует событие Click, которое всегда создается самим Button. Событие и его данные по-прежнему продолжаются на маршруте, но поскольку Button помечает данные события как Handled, вызываются только обработчики события, для которых специально указано, что они должны действовать в случае handledEventsToo. Если другим элементам в направлении корневого каталога приложения по-прежнему требуется возможность обработки события, подавляемого элементом управления, один из вариантов — присоединить обработчики в коде с handledEventsToo, указанным как true. Однако зачастую проще изменить направление маршрутизации, которое вы обрабатываете, чтобы оно было эквивалентно предварительному просмотру события ввода. Например, если элемент управления подавляет MouseLeftButtonDown, попробуйте подключить вместо этого обработчик PreviewMouseLeftButtonDown. Этот метод работает только для событий ввода базового элемента, таких как MouseLeftButtonDown. Эти события ввода используют пары туннелей и восходящих маршрутов, вызывают оба события и совместно используют данные событий.

Каждый из этих методов имеет свои ограничения и побочные эффекты. Побочным эффектом обработки события предварительного просмотра является то, что обработка события в этот момент может отключить обработчики, которые ожидают обработки события восходящей маршрутизации событий, и поэтому существует ограничение, согласно которому обычно не рекомендуется помечать обрабатываемое событие, пока оно все еще находится на этапе предварительной просмотра в маршруте. Ограничение метода handledEventsToo заключается в том, что нельзя указать обработчик handledEventsToo в XAML в качестве атрибута, необходимо зарегистрировать обработчик событий в коде после получения ссылки на объект элемента, к которому должен быть присоединен обработчик.

См. также