Относительно утилизации анимации Scoped Batch в UWP - PullRequest
0 голосов
/ 28 марта 2019

Я создаю анимацию в C # с помощью API композиции Windows 10. Более конкретно, я собираю вместе анимации, используя метод, показанный здесь , и он выполняет то, что мне нужно.

Мой вопрос заключается в том, что метод предлагает событие End (), которое запускается при завершении пакета. Я использую это, чтобы объединить несколько анимаций в разные элементы интерфейса. Должен ли я также использовать этот метод для очистки предыдущего набора анимаций, поскольку они мне больше не нужны? В любом случае они сделаны с использованием локальных переменных.

Вот мой код, подробно описывающий, что я имею в виду:

  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 Ответ

1 голос
/ 28 марта 2019

Поскольку рекомендуется всегда располагать объекты, которые реализуют IDisposable, как только вы их используете, вы должны располагать _batch в своем обработчике событий. Самый простой способ сделать это - обернуть его в оператор using:

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

После закрытия пакета его нельзя использовать, поэтому убедитесь, что вы ничего не пытаетесь сделать с аргументом sender в обработчике события Completed.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...