В целях иллюстрации предположим, что щелчок на элементе управления 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
.
Продолжение или прекращение пузырькового распространения
В текущий момент, когда пользователь щелкает на объекте 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
).
Роль туннельных маршрутизируемых событий
Строго говоря, маршрутизируемые события по своей природе могут быть Preview
— наподобие PreviewMouseDown
) спускаются от самого верхнего элемента до внутренних областей определения дерева объектов. В общем и целом для каждого пузырькового события в библиотеках базовых классов WPF предусмотрено связанное туннельное событие, которое возникает перед его пузырьковым аналогом. Например, перед возникновением пузырькового события MouseDown
сначала инициируется туннельное событие PreviewMouseDown
.
Обработка туннельных событий выглядит очень похожей на обработку любых других событий: нужно просто указать имя обработчика события в разметке XAML (или при необходимости применить соответствующий синтаксис обработки событий C# в файле кода) и реализовать такой обработчик в коде. Для демонстрации взаимодействия туннельных и пузырьковых событий начните с организации обработки события PreviewMouseDown
для объекта outerEllipse
:
MouseDown ="outerEllipse_MouseDown"
PreviewMouseDown ="outerEllipse_PreviewMouseDown"
Width ="50" Cursor="Hand" Canvas.Left="25" Canvas.Top="12"/>
Затем модифицируйте текущее определение класса С#, обновив обработчики событий (для всех объектов) за счет добавления данных о событии в переменную-член _mouseActivity
типа string
с использованием входного объекта аргументов события. В результате появится возможность наблюдать за потоком событий, появляющихся в фоновом режиме.
Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT