Ничего себе, это не было обновлено в течение долгого времени ... на всякий случай, если кто-то отслеживает это:
Проблема в том, что вы не дожидаетесь завершения анимации «перевернутый фронт», прежде чем сразу же начнете «переворачивать назад» - теперь, поскольку вы в основном принудительно перепрыгиваете анимацию угла Y сразу на 90 градусов, поэтому похоже, он не стреляет должным образом.
Существует множество способов обойти это - первое, что приходит на ум, - это то, что у DoubleAnimation
есть метод с именем CreateClock
, который вернет вам объект AnimationClock
. На этом объекте есть событие Completed
, которое сообщит вам, когда эта анимация будет завершена. Присоедините обработчик (помните, что вы захотите отсоединить его, чтобы не допустить утечки памяти), и вызовите там свой метод «начать перелистывать назад». Я бросил что-то очень неэффективное, но это покажет принцип:
public AnimationClock StartFlipFrontAnimation()
{
this.ImageFace.Source = _frontFace;
DoubleAnimation flipfront = new DoubleAnimation(0, 90, new Duration(new TimeSpan(0, 0, 3)));
SkewTransform skew = new SkewTransform();
this.RenderTransform = skew;
skew.BeginAnimation(SkewTransform.AngleYProperty, flipfront);
return flipfront.CreateClock();
}
public AnimationClock StartFlipBackAnimation()
{
this.ImageFace.Source = _backFace;
DoubleAnimation flipfront = new DoubleAnimation(90, 0, new Duration(new TimeSpan(0, 0, 3)));
SkewTransform skew = new SkewTransform();
this.RenderTransform = skew;
skew.BeginAnimation(SkewTransform.AngleYProperty, flipfront);
return flipfront.CreateClock();
}
public void BeginFlip()
{
var frontClk = StartFlipFrontAnimation();
frontClk.Completed += FrontFlipDone;
}
private void FrontFlipDone(object sender, EventArgs args)
{
var clk = sender as AnimationClock;
if(clk != null)
{
clk.Completed -= FrontFlipDone;
}
var backClk = StartFlipBackAnimation();
}