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

55

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

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

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

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

widthAnimation.Completed += animation_Completed;

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

cmd.BeginAnimation(Button.WidthProperty, null);

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

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

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