2

特定の状況で元に戻さなければならない無限のアニメーションがあります。元に戻すときは、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;
    });
}

イベント処理にブレークポイントを追加しましたが、アニメーションが停止しても発生しないようです。理由についての指針は大歓迎です。無限ではないアニメーションでまったく同じことを行いましたが、うまく機能しているようです (別のストーリーボードを使用しました)。

4

0 に答える 0