Xaml 带有RotationAnimation类用户界面的循环中的uwp旋转动画

Xaml 带有RotationAnimation类用户界面的循环中的uwp旋转动画,xaml,animation,uwp,uwp-xaml,windows-community-toolkit,Xaml,Animation,Uwp,Uwp Xaml,Windows Community Toolkit,我试图通过使用uwp社区工具包中的动画,在我的uwp应用程序中的UI元素上获得抖动或抖动效果。如果我在其上放置一个旋转动画,它会像预期的那样完美工作。但我实际上是在尝试将它们链接起来,然后将它们放在事件中的一个循环中,以便ui元素像震动一样循环 为此,我尝试以下代码 var parent = panel?.Parent as UIElement; if (parent != null) { while (true) { var animation = new Ro

我试图通过使用uwp社区工具包中的动画,在我的uwp应用程序中的UI元素上获得抖动或抖动效果。如果我在其上放置一个旋转动画,它会像预期的那样完美工作。但我实际上是在尝试将它们链接起来,然后将它们放在事件中的一个循环中,以便ui元素像震动一样循环

为此,我尝试以下代码

var parent = panel?.Parent as UIElement;
if (parent != null)
{
    while (true)
    {
        var animation = new RotationAnimation() { To = 0.3, Duration = TimeSpan.FromMilliseconds(100) };
        animation.StartAnimation(panel);

        var animation2 = new RotationAnimation() { From = 0.3, To = 0, Duration = TimeSpan.FromMilliseconds(100) };
        animation2.StartAnimation(parent);

        var animation3 = new RotationAnimation() { To = -0.3, Duration = TimeSpan.FromMilliseconds(100) };
        animation3.StartAnimation(panel);

        var animation4 = new RotationAnimation() { From = -0.3, To = 0, Duration = TimeSpan.FromMilliseconds(100) };
        animation4.StartAnimation(parent);
    }
}
如您所见,我从一些逻辑中获取UI元素,然后我尝试将4个旋转动画一个接一个地链接起来

顺时针旋转一点 返回正常状态。 逆时针旋转一点 返回正常状态。 这应该会产生我想要的抖动效果,但我的应用程序实际上会挂起,即使我尝试在没有while循环的情况下也不会出现任何异常。我首先尝试创建它,然后我的目标是使它在函数中异步,这样我就可以在元素上调用它,然后从另一个事件或方法停止动画

我有一种感觉,也许这不是从UWP社区工具包链接这些动画的正确方法,这就是为什么UI是冻结的,有更好的方法来做到这一点吗

另外,我也知道诸如panel.Rotate之类的扩展方法,它也是由community toolkit提供的,但我不想使用它们,因为我必须提供面板的centerX和centerY,并且我在其他场景中使用的缩放动画已经在相同的对象上,因此,我不确定如何提供UI元素的centerX和centerY

我还在那个特定的ui元素上使用扩展:VisualEx.NormalizedCenterPoint=0.5,0.5,0,这就是为什么我对提供中心点有点困惑的原因,因此,我们希望使用这个RotationAnimation类,它不接受任何中心点,并自动检测中心点作为元素的中心,这可能是因为我设置了xaml属性。

这里的问题是StartAnimation不等待动画完成。当您运行代码时,它实际上会尝试同时运行所有动画。在while true块中执行此操作时,情况会变得更糟,因为这将无限重复此过程,因此它可能会尝试同时启动数百个动画

作为快速修复,您可以添加等待任务。在各个阶段之间延迟100次调用,以确保UI等待动画完成。但是这个解决方案不是很好,它依赖于任务。延迟和动画将无法在100毫秒后100%可靠地运行

在上一个动画的已完成事件中运行下一个动画的更好解决方案:

animation.Completed += YourHandler;
然而,我们为什么要重新发明轮子?我们可以使用工具箱本身提供的动画集

动画集 AnimationSet类允许您创建复杂的动画并逐个链接它们。为此,可以使用Then方法,该方法将等待上一个动画完成,然后再开始下一个动画。看


AnimationSet不包含rotate和best overload Wastes Ui元素的定义,获取此编译错误使用Microsoft.Toolkit.Uwp.Ui.Animations添加;文件的语句Single rotate没有给出此错误,只有链接导致此错误。它应该作为扩展方法可用-查看是否手动编写AnimationExtensions。rotate AnimationSet是否存在重载?
var animationSet = panel.Rotate( 0.3 )
         .Then()
         .Rotate( -0.3 )
         .Then()
         .Rotate( 0.3 )
         .Then()
         .Rotate( -0.3 );