首页 > 解决方案 > 在 UWP 中将事件侦听器附加到 MotionAnimation

问题描述

我以这种方式设置了 MotionAnimation:

public static void StartSpringAnim(this Panel view)
{
    Visual viewVisual = ElementCompositionPreview.GetElementVisual(view);
    SpringScalarNaturalMotionAnimation springAnimation = viewVisual.Compositor.CreateSpringScalarAnimation();
    springAnimation.Period = TimeSpan.FromSeconds(0.1);
    springAnimation.DampingRatio = 0.5f;
    springAnimation.StopBehavior = AnimationStopBehavior.SetToFinalValue;
    springAnimation.InitialValue = (float) view.Margin.Left;
    springAnimation.FinalValue = (float)view.Margin.Left + 50;
    viewVisual.StartAnimation("Offset.X", springAnimation);
}

我想为动画附加一个事件处理程序,以便在动画完成后收到通知(以便我可以执行一些进一步的操作)。

我怎样才能达到这样的结果?

谢谢!

标签: c#animationuwp

解决方案


您可以使用跟踪合成动画CompositionScopedBatch

    public static void StartSpringAnim(this Panel view)
    {
        Visual viewVisual = ElementCompositionPreview.GetElementVisual(view);
        SpringScalarNaturalMotionAnimation springAnimation = viewVisual.Compositor.CreateSpringScalarAnimation();
        springAnimation.Period = TimeSpan.FromSeconds(0.1);
        springAnimation.DampingRatio = 0.5f;
        springAnimation.StopBehavior = AnimationStopBehavior.SetToFinalValue;
        springAnimation.InitialValue = (float)view.Margin.Left;
        springAnimation.FinalValue = (float)view.Margin.Left + 50;

        var scopedBatch = viewVisual.Compositor.CreateScopedBatch(CompositionBatchTypes.Animation);
        scopedBatch.Completed += Animation_Completed;
        viewVisual.StartAnimation("Offset.X", springAnimation);
        scopedBatch.End();
    }

    private void Animation_Completed(object sender, CompositionBatchCompletedEventArgs args)
    {
        //this will fire on animation complete
    }

更多信息在这里:https ://docs.microsoft.com/en-us/uwp/api/windows.ui.composition.compositionscopedbatch


推荐阅读