关于在UWP中处理范围批处理动画

时间:2019-03-28 08:57:01

标签: c# windows xaml memory-management uwp

我正在使用Windows 10 Composition API在C#中创建动画。更具体地说,我使用here所示的方法将动画批处理在一起,并且完成了我所需要的。

我的问题是,该技术提供了一个事件End(),该事件在批处理完成时触发。我正在使用它在不同的UI元素上链接多个动画。因为我不再需要它们了,我是否也应该使用这种方法来清理上一组动画?无论如何,它们都是使用局部变量制成的。

这是我的代码,详细说明了我的意思:

  private void GreetingTB_Loaded(object sender, RoutedEventArgs e)
    {
        var _compositor = new Compositor();

         _compositor = ElementCompositionPreview.GetElementVisual(GreetingTB).Compositor;
        var _visual = ElementCompositionPreview.GetElementVisual(GreetingTB);

        var _batch = _compositor.CreateScopedBatch(CompositionBatchTypes.Animation);

        var animation = _compositor.CreateScalarKeyFrameAnimation();
        animation.Duration = new TimeSpan(0, 0, 0, 2, 0);
        animation.InsertKeyFrame(0.0f, 0.0f);
        animation.InsertKeyFrame(1.0f, 1.0f);

        _batch.Completed += Batch_Completed;
        GreetingTB.Text = "Hello!";
        _visual.StartAnimation("Opacity", animation);
        _batch.End();
    }

    private void Batch_Completed(object sender, CompositionBatchCompletedEventArgs args)
    {
        args.Dispose();

     // Create new animation here
    }

为了防万一,我已经调用了args.Dispose()方法。但我想知道是否有更好的方法。是否需要使用“发送者”对象?

1 个答案:

答案 0 :(得分:1)

由于最佳实践是始终在完成使用IDisposable的对象后就对其进行处置,因此应在事件处理程序中处置_batch。最简单的方法是将其包装在using语句中:

using (var _batch = _compositor.CreateScopedBatch(CompositionBatchTypes.Animation))
{
    ...
    _batch.End();
}

关闭该批次后,将无法再使用它,因此请确保不要尝试使用sender事件处理程序中的Completed参数执行任何操作。