Предотвращение Bubbling события С#

Предположим, что у меня есть событие KeyPress, подписанное различными классами. Предположим, что класс A также подписывается на KeyPress в форме, а класс B также подписывается на KeyPress

Теперь я хочу, чтобы только один из этих классов обрабатывал событие, запущенное Формой во время выполнения. Это означает, что сначала используется класс A, я попытался использовать e.Handled = true, но это не помогает в этом случае.

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

Возможно ли это?

Да, возможно, нужно проверить e.Handled == true, а .NET позаботится об остальном: -)

Ответ 1

Вам нужно проверить e.Handled внутри каждого обработчика событий следующим образом Пример Gist, который я создал.

В основном каждый обработчик должен проверить e.Handled == true и вернуть, если он уже обработан. Свойство Handled не блокирует обработку события, оно только отбрасывает аргументы для каждого подписанного события.

В моем примере класс Form1 всегда обрабатывает событие первым, потому что он подключен в конструкторе Form1. Таким образом, установив в этом случае e.Handled = true, а затем проверив e.Handled == true в других событиях, я могу сразу вернуться сразу, когда e.Handled == true.