我正在使用Windows 10 Composition API在C#中创建动画。更具体地说,我正在使用此处显示的方法将动画批处理在一起,它正在完成我需要的。
我的问题是,该技术提供了一个事件 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
}
我已经叫了参数。Dispose(( 方法,以防万一。但我想知道是否有更好的方法。是否需要使用"发送方"对象?
由于最佳做法是在使用完对象后立即释放实现IDisposable
的对象,因此应在事件处理程序中释放_batch
。最简单的方法是将其包装在 using
语句中:
using (var _batch = _compositor.CreateScopedBatch(CompositionBatchTypes.Animation))
{
...
_batch.End();
}
关闭批处理后,将无法再使用它,因此请确保不要尝试对 Completed
事件处理程序中的 sender
参数执行任何操作。