Вопрос
У меня есть что-то вроде этого:
barProgress.BeginAnimation(RangeBase.ValueProperty, new DoubleAnimation( barProgress.Value, dNextProgressValue, new Duration(TimeSpan.FromSeconds(dDuration)));
Теперь, как бы вы остановили эту анимацию ( DoubleAnimation
)?Причина, по которой я хочу это сделать, заключается в том, что я хотел бы запустить новую анимацию (кажется, это работает, но трудно сказать) и в конечном итоге остановить последнюю анимацию...
Решение
Чтобы остановить это, позвоните BeginAnimation
снова со вторым аргументом, установленным в null
.
Другие советы
При использовании раскадровки для управления анимацией убедитесь, что для второго параметра установлено значение true, чтобы анимация стала управляемой:
public void Begin(
FrameworkContentElement containingObject,
**bool isControllable**
)
Есть два способа остановить BeginAnimation.Первый — снова вызвать BeginAnimation со вторым параметром, равным нулю.Это приведет к удалению всех анимаций в свойстве и возвращаться значение возвращается к своему базовому значению.
В зависимости от того, как вы используете это значение, это может быть не то поведение, которое вам нужно.Второй способ — установить для BeginTime анимации значение null, а затем вызвать с его помощью BeginAnimation.Это удалит эту конкретную анимацию и оставит значение в текущей позиции.
DoubleAnimation myAnimation = new Animation();
// Initialize animation
...
// To start
element.BeginAnimation(Property, myAnimation);
// To stop and keep the current value of the animated property
myAnimation.BeginTime = null;
element.BeginAnimation(Property, myAnimation);
Если вы хотите, чтобы базовое значение снова стало эффективным значением, вы должны помешать анимации влиять на свойство.Есть три способа сделать это с помощью раскадровки анимации:
- Установите свойство Fillbehavior, чтобы остановиться
- Удалить всю раскадровку
- Удалить анимацию из отдельного свойства
Из MSDN
Как:Установите свойство после анимации его с помощью раскадровки
В моем случае мне пришлось использовать две команды: в моем xaml есть кнопка, которая запускает триггер, и ее триггер запускает анимацию раскадровки.
Я добавил кнопку остановки анимации с помощью этого кода:
MyBeginStoryboard.Storyboard.Begin(this, true);
MyBeginStoryboard.Storyboard.Stop(this);
Мне это не нравится, но здесь это действительно работает.Попробуйте!
<Trigger.EnterActions>
<BeginStoryboard x:Name="myStory">
.........
</BeginStoryboard>
</Trigger.EnterActions>
<Trigger.ExitActions>
<StopStoryboard BeginStoryboardName="myStory"/>
</Trigger.ExitActions>
Поместите анимацию в StoryBoard.Вызовите Begin() и Stop() в раскадровке, чтобы начать и остановить анимацию.
Вы можете использовать этот код:
[StoryBoardName].Remove([StoryBoardOwnerControl]);