Читаем Язык программирования C#9 и платформа .NET5 полностью

К счастью, маршрутизируемые события WPF позаботятся об автоматическом вызове единственного обработчика события Click вне зависимости от того, на какой части кнопки был совершен щелчок. Выражаясь просто, модель маршрутизируемых событий автоматически распространяет событие вверх (или вниз) по дереву объектов в поисках подходящего обработчика.

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

<p id="AutBody_Root1141"><strong>Роль пузырьковых маршрутизируемых событий</strong></p>

В текущем примере, когда пользователь щелкает на внутреннем овале желтого цвета, событие Click поднимается на следующий уровень области определения (Canvas), затем на StackPanel и в итоге на уровень Button, где обрабатывается. Подобным же образом, если пользователь щелкает на Label, то событие всплывает на уровень StackPanel и, в конце концов, попадает в элемент Button.

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

В целях иллюстрации предположим, что щелчок на элементе управления outerEllipse должен быть обработан в уникальной манере. Сначала обработайте событие MouseDown для этого подэлемента (графически визуализируемые типы вроде Ellipse не поддерживают событие Click, но могут отслеживать действия кнопки мыши через события MouseDown, MouseUp и т.д.):

    Click ="btnClickMe_Clicked">

 

   

   

   

        Height ="25" MouseDown ="outerEllipse_MouseDown"

        Width ="50" Cursor="Hand" Canvas.Left="25" Canvas.Top="12"/>

   

        Canvas.Top="17" Canvas.Left="32"/>

   

 

Затем реализуйте подходящий обработчик событий, который в демонстрационных целях будет просто изменять свойство Title главного окна:

public void outerEllipse_MouseDown(object sender, MouseButtonEventArgs e)

{

  // Изменить заголовок окна.

  this.Title = "You clicked the outer ellipse!";

}

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

На заметку! Пузырьковые маршрутизируемые события всегда перемещаются из точки возникновения до следующей определяющей области. Таким образом, в рассмотренном примере щелчок на элементе innerEllipse привел бы к попаданию события в контейнер Canvas, а не в элемент outerEllipse, потому что оба элемента являются типами Ellipse внутри области определения Canvas.

<p id="AutBody_Root1142"><strong>Продолжение или прекращение пузырькового распространения</strong></p>

В текущий момент, когда пользователь щелкает на объекте outerEllipse, запускается зарегистрированный обработчик события MouseDown для данного объекта Ellipse, после чего событие всплывет до события Click кнопки. Чтобы информировать WPF о необходимости останова пузырькового распространения по дереву объектов, свойство Handled параметра MouseButtonEventArgs понадобится установить в true:

public void outerEllipse_MouseDown(object sender, MouseButtonEventArgs e)

{

  // Изменить заголовок окна.

  this.Title = "You clicked the outer ellipse!";

  // Остановить пузырьковое распространение.

  e.Handled = true;

}

В таком случае обнаружится, что заголовок окна изменился, но окно MessageBox, отображаемое обработчиком события Click элемента Button, не появляется. По существу пузырьковые маршрутизируемые события позволяют сложной группе содержимого действовать либо как единый логический элемент (например, Button), либо как отдельные элементы (скажем, Ellipse внутри Button).

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных