特定の状況で元に戻さなければならない無限のアニメーションがあります。元に戻すときは、1 回だけ実行する必要があります。
次のように、コンストラクターでアニメーションを初期化します。
public RailComponent()
{
InitializeComponent();
RootCanvas.DataContext = this;
//RailAnimation
_railAnimation = new DoubleAnimation
{
RepeatBehavior = RepeatBehavior.Forever,
To = -_animationTo,
Duration = new Duration(TimeSpan.FromSeconds(TrackRunningTime))
};
...
}
そして、それをストーリーボードに追加します:
private void InitializeAnimations()
{
Storyboard.SetTarget(_railAnimation, RailImage);
Storyboard.SetTargetProperty(_railAnimation, new PropertyPath("(Image.RenderTransform).(TranslateTransform.X)"));
AddAnimation(_railAnimation);
...
}
AddAnimation は次のように定義されます。
protected void AddAnimation(DoubleAnimation animation)
{
saveAnimationHandling(() => Railstoryboard.Children.Add(animation));
}
private void saveAnimationHandling(Action animationAction)
{
TimeSpan current = GetCurrentStoryboardTime();
StopStoryboard();
animationAction();
StartStoryboard();
Railstoryboard.Seek(current);
SetVelocity();
}
同じストーリーボードを介して複数のアニメーションを処理します (つまり、それらを追加または削除します)。だからこそ、それらを「安全に」処理しなければなりません。上記のコードは意図したとおりに機能します (または、その誤動作を適切に隠します)。しかし、いくつかのプロパティを変更して Completed イベントを追加しようとすると、決して発生しません。
private void UpdateDirection(bool isBackward)
{
PauseRailStoryBoard();
var x = -RailImage.RenderTransform.Value.OffsetX;
var duration = x / _animationTo * TrackRunningTime;
_railAnimation.To = 0;
_railAnimation.Duration = TimeSpan.FromSeconds(duration);
_railAnimation.RepeatBehavior = new RepeatBehavior(1);
_railAnimation.Completed += _backwardRailAnimation_Completed;
ResumeRailStoryBoard();
}
void _backwardRailAnimation_Completed(object sender, EventArgs e)
{
_railAnimation.Completed -= _backwardRailAnimation_Completed;
}
編集 - 動作しない代替バージョン (saveHandleAnimation は、このバージョンでは保護されていません):
private void UpdateDirection(bool isBackward)
{
saveHandleAnimation(() =>
{
var x = -RailImage.RenderTransform.Value.OffsetX;
var duration = x / _animationTo * TrackRunningTime;
_railAnimation.To = 0;
_railAnimation.Duration = TimeSpan.FromSeconds(duration);
_railAnimation.RepeatBehavior = new RepeatBehavior(1);
_railAnimation.Completed += _backwardRailAnimation_Completed;
});
}
イベント処理にブレークポイントを追加しましたが、アニメーションが停止しても発生しないようです。理由についての指針は大歓迎です。無限ではないアニメーションでまったく同じことを行いましたが、うまく機能しているようです (別のストーリーボードを使用しました)。