UWP: Как анимировать RenderTranform и сохранить его пригодным для использования после этого? - PullRequest
0 голосов
/ 26 марта 2019

У меня есть очень простой проект, в котором мне нужно анимировать RenderTransform элемента, а затем дополнительно управлять таким преобразованием.

Пожалуйста, найдите в качестве ссылки MVCE здесь: https://github.com/cghersi/UWPExamples/tree/master/RenderTransformAnimation.

Сценарий следующий: существует ScrollViewer m_scrollView с содержанием Canvas m_zoomView.Для примера у нас также есть CompositeTransform m_zoomViewTransform = m_zoomView.RenderTransform.

. Я использую следующий метод для манипуляции с RenderTransform, с анимацией или без нее:

private void SetEffectiveOffsetOfScrollView(Point newOffset, bool isAnimated)
{
    if (isAnimated)
    {
        TimeSpan dur = TimeSpan.FromSeconds(0.2);
        Storyboard sb = new Storyboard { Duration = dur };
        DoubleAnimation animationX = new DoubleAnimation
        {
            To = newOffset.X,
            Duration = dur,
            AutoReverse = false
        };
        DoubleAnimation animationY = new DoubleAnimation
        {
            To = newOffset.Y,
            Duration = dur,
            AutoReverse = false
        };
        sb.Children.Add(animationX);
        sb.Children.Add(animationY);
        Storyboard.SetTarget(animationX, m_zoomViewTransform);
        Storyboard.SetTarget(animationY, m_zoomViewTransform);
        Storyboard.SetTargetProperty(animationX, "CompositeTransform.TranslateX");
        Storyboard.SetTargetProperty(animationY, "CompositeTransform.TranslateY");

        sb.Begin();
        sb.Completed += (sender, o) =>
        {
            m_zoomViewTransform.TranslateX = newOffset.X;
            m_zoomViewTransform.TranslateY = newOffset.Y;
        };
    }
    else
    {
        m_zoomViewTransform.TranslateX = newOffset.X;
        m_zoomViewTransform.TranslateY = newOffset.Y;
    }
}

Теперь, если яиспользуйте SetEffectiveOffsetOfScrollView() с isAnimated = true, я больше не могу изменить RenderTransform или, по крайней мере, я больше не вижу никаких обновлений пользовательского интерфейса.

В MVCE я добавил кнопку, котораявызывает метод SetEffectiveOffsetOfScrollView() с isAnimated = true, и я добавил событие Manipulation для панорамирования m_zoomView Canvas: как только я нажимаю на кнопку, я больше не могу панорамировать Canvas.

Как я могу анимировать преобразование, все еще имея возможность видеть обновления пользовательского интерфейса после этого действия, используя SetEffectiveOffsetOfScrollView() с animate=false?

1 Ответ

1 голос
/ 10 мая 2019

Это связано с приоритетом значения свойства зависимости, как описано здесь: https://docs.microsoft.com/en-us/windows/uwp/xaml-platform/dependency-properties-overview#dependency-property-value-precedence

В этом воспроизведении раскадровка все еще активна из-за значения по умолчанию FillBehavior = HoldEnd для DoubleAnimations. Так как эти анимации все еще живы, используется анимированное значение, даже если для случая isAnimated = false установлены новые локальные значения.

Простое решение - вызвать sb.Stop () в обработчике Completed Storyboard после того, как вы установили новые локальные значения для хранения. Это остановит анимацию, удалит анимированные значения, которые они содержат, и позволит использовать локальные значения.

...