Предотвратить пузыри событий C # - PullRequest
11 голосов
/ 10 мая 2011

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

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

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

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

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

1 Ответ

10 голосов
/ 10 мая 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...