Диспетчер событий
Система событий просматривает события, поступающие от операционной системы или скриптов, затем использует EventDispatcher для отправки этих событий визуальным элементам. Диспетчер событий определяет соответствующую стратегию отправки для каждого события, которое он отправляет. После определения, диспетчер выполняет стратегию.
Визуальные элементы реализуют поведение по умолчанию для нескольких событий. Это включает в себя создание и выполнение дополнительных событий. Например, PointerMoveEvent может генерировать дополнительные PointerEnterEvent и PointerLeaveEvent. Эти события входят в очередь и обрабатываются после текущего события. Например, PointerMoveEvent завершает обработку до событий PointerEnterEvent и PointerLeaveEvent.
Поведение рассылки типов событий
Каждый тип события имеет собственное поведение отправки. Поведение каждого типа события подразделяется на две стадии:
- Просачивается: События, отправленные элементам во время фазы снижения уровня.
- Пузыри вверх: События, отправленные элементам в ходе фазы возникновения пузырька.
Список поведения отправки для каждого типа событий см. в разделе Справочная страница события.
Распространение событий
После того, как диспетчер событий выберет цель события, он вычисляет путь распространения события. Путь распространения представляет собой упорядоченный список визуальных элементов, которые получают событие. Путь распространения происходит в следующем порядке:
- Путь начинается в корне дерева визуального элемента и спускается к цели. Это фаза фаза погружения. Цель является последним элементом, который получает событие в течение этой фазы.
- Затем событие поднимается по дереву к корню. Это фаза фаза всплытия. Целевой элемент первым получает событие во время этой фазы.
Каждый элемент в пути распространения, включая цель, получает событие дважды: один раз во время фазы trickle-down и один раз во время фазы bubble-up. В результате, обратные вызова на цель, зарегистрированные с TrickleDown.TrickleDown, гарантировано выполняются раньше, чем те, которые зарегистрированы с TrickleDown.NoTrickleDownпо умолчанию.
Большинство типов событий отправляются ко всем элементам вдоль пути распространения. Некоторые типы событий пропускают фазу распространения, а некоторые типы событий отправляются только к объекту события.
Если элемент скрыт или отключен, он не получает событий. События по-прежнему распространяются на предшественников и потомков скрытого или отключенного элемента.
Цель мероприятия
По мере прохождения события по пути распространения, Event.currentTarget обновляется для элемента, обрабатывающего событие. В функции обратного вызова события есть два свойства, которые регистрируют поведение отправки:
EventBase.currentTarget— визуальный элемент, на котором был зарегистрирован обратный вызов.EventBase.target— элемент, в котором происходит событие, например, элемент непосредственно под указателем.
Цель события зависит от типа события. Для событий указателя целью чаще всего является самый верхний элемент, который можно выбрать, прямо под указателем. Для событий клавиатуры целью является элемент, на котором находится фокус.
События UI Toolkit имеют свойство target, которое содержит ссылку на элемент, в котором произошло событие. Для большинства событий, происходящих из операционной системы, процесс отправки автоматически находит объект события.
Целевой элемент хранится в EventBase.target и не изменяется во время процесса отправки. Свойство Event.currentTarget обновляется для визуального элемента, который в данный момент обрабатывает событие.
ChangeEvent Если вы зарегистрируете обработчика на одном из серверов, предок элемент, ваш обратный вызов запускается, когда ребенок контрольных отправленийa ChangeEvent одного и того же типа; target — управление, которое инициировано изменения, в то время как currentTarget элемент, в котором вы зарегистрировали обработчик. Чтобы запустить логику только для одного контроля, сравните evt.target Для подробностей и оговорок (включая составные элементы управления и вложенную отправку) см. События изменения.
Режим подбора и пользовательские формы
Большинство событий указателя используют режим выбора для определения своей цели. VisualElement класс имеет pickingMode свойство, которое поддерживает следующие значения:
PickingMode.Position(по умолчанию): выполняет подбор на основе прямоугольника позиции.PickingMode.Ignore: предотвращает выбор в результате события указателя.
Вы можете переопределить VisualElement.ContainsPoint() метод для выполнения логики пользовательского пересечения.