Uwp 如何检测动画何时停止和属性何时更新?

Uwp 如何检测动画何时停止和属性何时更新?,uwp,Uwp,如果我在视觉层中创建并启动动画,我可以使用停止动画。但当我这样做时,似乎需要一段时间才能停止动画,并用最新的值更新属性。有什么办法吗?在下面的代码中,我等待10毫秒,但这只在某些时候有效 public sealed partial class MainPage : Page { SpriteVisual MyVisual; public MainPage() { this.InitializeComponent(); PointerRe

如果我在视觉层中创建并启动动画,我可以使用停止动画。但当我这样做时,似乎需要一段时间才能停止动画,并用最新的值更新属性。有什么办法吗?在下面的代码中,我等待10毫秒,但这只在某些时候有效

public sealed partial class MainPage : Page
{
    SpriteVisual MyVisual;

    public MainPage()
    {
        this.InitializeComponent();

        PointerReleased += MainPage_PointerReleased;
    }


    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);

        var compositor = ElementCompositionPreview.GetElementVisual(this).Compositor;

        MyVisual = compositor.CreateSpriteVisual();

        MyVisual.Size = new Vector2(80, 80);
        MyVisual.Offset = new Vector3(50, 50, 0);
        MyVisual.Brush = compositor.CreateColorBrush(Colors.Green);

        ElementCompositionPreview.SetElementChildVisual(this, MyVisual);

        var animation = compositor.CreateVector3KeyFrameAnimation();
        animation.InsertKeyFrame(1, new Vector3(300, 50, 0));
        animation.Duration = TimeSpan.FromSeconds(3);
        animation.IterationBehavior = AnimationIterationBehavior.Forever;

        MyVisual.StartAnimation(nameof(MyVisual.Offset), animation);
    }

    private async void MainPage_PointerReleased(object sender, PointerRoutedEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("Position when animation running: " + MyVisual.Offset);

        MyVisual.StopAnimation(nameof(MyVisual.Offset));

        await Task.Delay(10);

        System.Diagnostics.Debug.WriteLine("Position when animation stopped: " + MyVisual.Offset);
    }
}
你可以用它来解决这个问题。需要注意的一点是,如果迭代次数无限(我不知道为什么),事件会立即触发。以下是一个示例:

public sealed partial class MainPage : Page
{
    SpriteVisual MyVisual;
    CompositionScopedBatch ScopedBatch;

    public MainPage()
    {
        this.InitializeComponent();

        PointerReleased += MainPage_PointerReleased;
    }

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);

        var compositor = ElementCompositionPreview.GetElementVisual(this).Compositor;

        MyVisual = compositor.CreateSpriteVisual();

        MyVisual.Size = new Vector2(80, 80);
        MyVisual.Offset = new Vector3(50, 50, 0);
        MyVisual.Brush = compositor.CreateColorBrush(Colors.Green);

        ElementCompositionPreview.SetElementChildVisual(this, MyVisual);

        ScopedBatch = compositor.CreateScopedBatch(CompositionBatchTypes.Animation);

        var animation = compositor.CreateVector3KeyFrameAnimation();
        animation.InsertKeyFrame(1, new Vector3(300, 50, 0));
        animation.Duration = TimeSpan.FromSeconds(3);
        // animation.IterationBehavior = AnimationIterationBehavior.Forever;
        // CompositionScopedBatch.Completed is triggered immediately if Infinite is used.
        // Use many iterations instead.
        animation.IterationBehavior = AnimationIterationBehavior.Count;
        animation.IterationCount = 1000000;

        MyVisual.StartAnimation(nameof(MyVisual.Offset), animation);

        ScopedBatch.Completed += CompositionScopedBatch_Completed;

        ScopedBatch.End();
    }

    private void CompositionScopedBatch_Completed(object sender, CompositionBatchCompletedEventArgs args)
    {
        System.Diagnostics.Debug.WriteLine("Position when batch completed: " + MyVisual.Offset);
    }

    private void MainPage_PointerReleased(object sender, PointerRoutedEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("Position when animation running: " + MyVisual.Offset);

        MyVisual.StopAnimation(nameof(MyVisual.Offset));
    }
}
你可以用它来解决这个问题。需要注意的一点是,如果迭代次数无限(我不知道为什么),事件会立即触发。以下是一个示例:

public sealed partial class MainPage : Page
{
    SpriteVisual MyVisual;
    CompositionScopedBatch ScopedBatch;

    public MainPage()
    {
        this.InitializeComponent();

        PointerReleased += MainPage_PointerReleased;
    }

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);

        var compositor = ElementCompositionPreview.GetElementVisual(this).Compositor;

        MyVisual = compositor.CreateSpriteVisual();

        MyVisual.Size = new Vector2(80, 80);
        MyVisual.Offset = new Vector3(50, 50, 0);
        MyVisual.Brush = compositor.CreateColorBrush(Colors.Green);

        ElementCompositionPreview.SetElementChildVisual(this, MyVisual);

        ScopedBatch = compositor.CreateScopedBatch(CompositionBatchTypes.Animation);

        var animation = compositor.CreateVector3KeyFrameAnimation();
        animation.InsertKeyFrame(1, new Vector3(300, 50, 0));
        animation.Duration = TimeSpan.FromSeconds(3);
        // animation.IterationBehavior = AnimationIterationBehavior.Forever;
        // CompositionScopedBatch.Completed is triggered immediately if Infinite is used.
        // Use many iterations instead.
        animation.IterationBehavior = AnimationIterationBehavior.Count;
        animation.IterationCount = 1000000;

        MyVisual.StartAnimation(nameof(MyVisual.Offset), animation);

        ScopedBatch.Completed += CompositionScopedBatch_Completed;

        ScopedBatch.End();
    }

    private void CompositionScopedBatch_Completed(object sender, CompositionBatchCompletedEventArgs args)
    {
        System.Diagnostics.Debug.WriteLine("Position when batch completed: " + MyVisual.Offset);
    }

    private void MainPage_PointerReleased(object sender, PointerRoutedEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("Position when animation running: " + MyVisual.Offset);

        MyVisual.StopAnimation(nameof(MyVisual.Offset));
    }
}