Триггер события
79WPF --- Привязка, команды и стили WPF --- Триггер события
Если обычный триггер ожидает изменения свойства, то триггер события (EventTrigger) ожидает возникновения конкретного события. Может показаться, что на этом этапе применяются средства установки для изменения элемента, однако это не так. Вместо этого триггер событий требует предоставления последовательности действий, модифицирующих элемент управления. Эти действия используются для применения анимации.
Ниже показан простой пример, в котором триггер событий ожидает события MouseEnter и затем выполняет анимацию свойства FontSize кнопки, увеличивая размер шрифта до 22 единиц за 0.2 секунды:
<Style x:Key="ResizeFont">
<Style.Triggers>
<EventTrigger RoutedEvent="Mouse.MouseEnter">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0:0:0.2"
Storyboard.TargetProperty="FontSize"
To="22">
</DoubleAnimation>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
</Style.Triggers>
</Style>
В XAML каждый анимационный эффект должен определяться в раскадровке, которая предоставляет временную шкалу для анимации. Внутри раскадровки задается объект или объекты анимации, которые должны использоваться. Каждый объект анимации решает, по сути, одну и ту же задачу — модифицирует свойство зависимости на протяжении какого-то периода времени.
В настоящем примере применяется предварительно определенный класс анимации по имени DoubleAnimation (который, как и все классы анимации, находится в пространстве имен System.Windows.Media.Animation). Класс DoubleAnimation позволяет постепенно изменять любое значение double (такое как FontSize) для получения целевого результата за определенный период времени.
Поскольку значение double изменяется небольшими дробными величинами, визуально шрифт увеличивается постепенно. Фактический размер изменения зависит от общего промежутка времени и объема изменений, которые требуется внести. В данном примере размер шрифта изменяется с текущего значения до 22 единиц за 0,2 секунды. (Настраивая свойства класса DoubleAnimation, можно подогнать эти детали более точно и получить анимацию с ускорением или замедлением.)
В отличие от триггеров свойств, действие триггеров событий необходимо обращать, чтобы элемент возвращался в свое исходное состояние! (Дело в том, что по умолчанию после завершения анимация остается активной и тем самым сохраняет за свойством последнее значение.) Чтобы вернуть размер шрифта в исходное состояние, в текущем примере в стиле используется триггер событий, который реагирует на событие MouseLeave и уменьшает шрифт до исходного размера за две секунды. Указывать целевой размер шрифта в данном случае не требуется: если он не указан. WPF предполагает, что кнопке нужно вернуть первоначальный размер шрифта, который был перед выполнением анимации:
<EventTrigger RoutedEvent="Mouse.MouseLeave">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Duration="0:0:1"
Storyboard.TargetProperty="FontSize">
</DoubleAnimation>
</Storyboard>
</BeginStoryboard>
</EventTrigger.Actions>
</EventTrigger>
Интересно, что можно сделать так, чтобы анимация выполнялась при достижении свойством зависимости определенного значения. Это очень удобно в ситуации, когда необходимо запустить анимацию, а подходящего события нет.
Для применения такого подхода необходим триггер свойств, рассмотренный в предыдущей статье. Трюк состоит в том, что для этого триггера свойств средства установки не предоставляются, а вместо этого устанавливаются свойства Trigger.EnterActions и Trigger.ExitActions. Оба эти свойства в качестве значения принимают коллекцию действий, таких как BeginStoryboard — действие, запускающее анимацию. Действия EnterActions выполняются при достижении свойством указанного значения, а действия ExitActions — при изменении указанного значения на другое.