UWP:如何为RenderTranform设置动画并使其保持可用状态?

时间:2019-03-26 01:45:15

标签: c# animation uwp rendertransform

我有一个非常简单的项目,需要对一个元素的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,或者至少我看不到该UI的任何更新。 / p>

在MVCE中,我添加了一个按钮,该按钮使用SetEffectiveOffsetOfScrollView()调用isAnimated = true方法,并且添加了一个Manipulation事件来平移m_zoomView Canvas:单击按钮后,我无法平移Canvas

如何使用SetEffectiveOffsetOfScrollView()animate=falsetempfile.py将转换动画化,仍然可以在执行此操作后查看UI更新?

1 个答案:

答案 0 :(得分:1)

这是由于依赖项属性值优先级所致,如下所述: https://docs.microsoft.com/en-us/windows/uwp/xaml-platform/dependency-properties-overview#dependency-property-value-precedence

在此副本中,由于DoubleAnimations上的默认FillBehavior = HoldEnd,情节提要板仍处于活动状态。由于这些动画仍然存在,因此即使在isAnimated = false情况下设置了新的局部值,也会使用动画值。

最简单的解决方法是在将新的本地值设置为hold之后,在情节提要的Completed处理程序中调用sb.Stop()。这将停止动画,删除其持有的Animated值,并允许使用Local值。