Нашли ошибку или опечатку? Выделите текст и нажмите

Поменять цветовую

гамму сайта?

Поменять
Обновления сайта
и новые разделы

Рекомендовать в Google +1

Время жизни анимации

55

Формально анимации WPF являются временными, а это означает, что они в действительности не изменяют значения лежащего в основе свойства. Пока анимация активна, она просто переопределяет значение свойства. Это связано со способом работы свойств зависимости и часто имеет скрытые детали, которые могут приводить к серьезной путанице.

Однонаправленная анимация (как анимация роста кнопки) остается активной и после завершения ее работы. Это объясняется тем, что анимация должна удерживать ширину кнопки в новом размере. Это может привести к неожиданной проблеме, а именно: попытка модифицировать значение свойства в коде после завершения анимации никакого эффекта не дает. Причина в том, что код просто присваивает свойству новое локальное значение, но анимированное значение имеет приоритет перед ним.

В зависимости от того, чего нужно достигнуть, эту проблему можно решить несколькими способами:

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

  • Создать обратимую анимацию. Это делается посредством установки свойства AutoReverse в true. Например, когда завершается анимация увеличения кнопки, она запускается в обратном направлении, возвращая кнопку в исходное состояние. Общая длительность анимации при этом удваивается.

  • Изменить свойство FillBehavior. Изначально FillBehavior установлено в HoldEnd, а это означает, что когда анимация завершится, ее финальное значение будет применено к целевому свойству. Если изменить FillBehavior на Stop, то по завершении анимации свойство вернется к своему исходному значению.

  • Удалить объект анимации по ее завершении, обработав событие Completed объекта анимации.

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

widthAnimation.Completed += animation_Completed;

Completed — это нормальное событие .NET, которое принимает обычный объект EventArgs с дополнительной информацией. Это не маршрутизируемое событие. Когда возникает событие Completed, можно вновь привести анимацию в действие, вызвав метод BeginAnimation(). Понадобится просто указать свойство и передать null-ссылку для объекта анимации:

cmd.BeginAnimation(Button.WidthProperty, null);

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

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

Пройди тесты