Присоединение обработчиков событий

89

Средства установки свойств являются наиболее общим ингредиентом в любом стиле, но можно также создать коллекцию объектов EventSetter, связывающих события с определенными обработчиками. Ниже показан пример присоединения обработчиков для событий MouseEnter и MouseLeave:

<Style x:Key="MouseOverHighlightStyle">
            <EventSetter Event="TextBlock.MouseEnter" Handler="element_MouseEnter"></EventSetter>
            <EventSetter Event="TextBlock.MouseLeave" Handler="element_MouseLeave"></EventSetter>
            <Setter Property="TextBlock.Padding" Value="5"></Setter>
            <Setter Property="TextBlock.Margin" Value="5"></Setter>
</Style>

А вот код для обработки этих событий:

private void element_MouseEnter(object sender, MouseEventArgs e)
{
    ((TextBlock)sender).Background = new SolidColorBrush(Colors.LightBlue);
}

private void element_MouseLeave(object sender, MouseEventArgs e)
{
    ((TextBlock)sender).Background = null;
}

События MouseEnter и MouseLeave маршрутизируются напрямую, а это означает, что они не могут ни распространяться пузырьком вверх, ни туннелироваться вниз по дереву элементов. Чтобы применить эффект наведения курсора мыши к большому количеству элементов (например, изменить цвет фона элемента при наведении на него курсора мыши), обработчики событий MouseEnter и MouseLeave должны быть добавлены в каждый интересующий элемент. Обработчики событий, основанные на стилях, позволяют упростить эту задачу. Нужно просто применить единственный стиль, который может включать средства установки свойств и средства установки событий:

Обработка событий с помощью стилей

На рисунке показан простой пример, демонстрирующий применение этого приема в отношении трех элементов, два из которых используют стиль MouseOverHighlightStyle.

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

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

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

Пройди тесты
Лучший чат для C# программистов