如何平滑WPF动画?

如何平滑WPF动画?,wpf,animation,storyboard,Wpf,Animation,Storyboard,我正在努力平滑WPF动画 实际上,我的动画代码如下所示: private void AnimateX ( FrameworkElement element, double XMoveStart, double XMoveEnd, int secondX) { SineEase eEase = new SineEase(); eEase.EasingMode = EasingMode.EaseInOut; Storyboard sb = new Storyboard();

我正在努力平滑WPF动画

实际上,我的动画代码如下所示:

private void AnimateX ( FrameworkElement element, double XMoveStart, double XMoveEnd, int secondX)
{

    SineEase eEase = new SineEase();
    eEase.EasingMode = EasingMode.EaseInOut;
    Storyboard sb = new Storyboard();

    DoubleAnimation daX = new DoubleAnimation(XMoveStart, XMoveEnd, new Duration(new TimeSpan(0, 0, 0, secondX, 0)));
    daX.EasingFunction = eEase;
    Storyboard.SetTargetProperty(daX, new PropertyPath("(Canvas.Left)"));

    sb.Children.Add(daX);

    element.BeginStoryboard(sb);
}

上面的代码是一种简单地水平移动对象的方法。当只有一个对象在移动时,这是正常的。但是,每当两个或多个对象一起移动时(当上一个动画尚未完成时,对另一个对象调用AnimateX方法),动画开始变得抖动。我所说的抖动是指,对象在动画过程中有点摇晃。

只是猜测,但是如果您不使用故事板直接为属性设置动画,会发生什么

private void AnimateX(FrameworkElement element, double xMoveStart, double xMoveEnd, double durationSeconds)
{
    DoubleAnimation animation = new DoubleAnimation
    {
        From = xMoveStart,
        To = xMoveEnd,
        Duration = TimeSpan.FromSeconds(durationSeconds),
        EasingFunction = new SineEase { EasingMode = EasingMode.EaseInOut }
    };

    element.BeginAnimation(Canvas.LeftProperty, animation);
}

只是一个猜测,但是如果您直接设置属性的动画,而不使用情节提要,会发生什么

private void AnimateX(FrameworkElement element, double xMoveStart, double xMoveEnd, double durationSeconds)
{
    DoubleAnimation animation = new DoubleAnimation
    {
        From = xMoveStart,
        To = xMoveEnd,
        Duration = TimeSpan.FromSeconds(durationSeconds),
        EasingFunction = new SineEase { EasingMode = EasingMode.EaseInOut }
    };

    element.BeginAnimation(Canvas.LeftProperty, animation);
}

我曾多次面对同样的问题。我发现,根据您添加到画布中的对象,WPF通常必须在每个帧上重新生成这些对象的表示(我认为这可能是您的情况,取决于您正在操作的UI元素的类型)。您可以通过告诉WPF在位图中缓存画布的表示来解决抖动问题。在画布的Xaml定义中,这样做非常简单:

<Canvas ...Your canvas properties...>
    <Canvas.CacheMode>
        <BitmapCache />
    </Canvas.CacheMode>
    ...Your objects...
</Canvas>`

我曾多次面对同样的问题。我发现,根据您添加到画布中的对象,WPF通常必须在每个帧上重新生成这些对象的表示(我认为这可能是您的情况,取决于您正在操作的UI元素的类型)。您可以通过告诉WPF在位图中缓存画布的表示来解决抖动问题。在画布的Xaml定义中,这样做非常简单:

<Canvas ...Your canvas properties...>
    <Canvas.CacheMode>
        <BitmapCache />
    </Canvas.CacheMode>
    ...Your objects...
</Canvas>`

你知道你的计算机是用软件渲染还是硬件加速来做动画吗?是的,我只是用RenderCapability来测试它,它是硬件加速的。你有没有让主线程忙着用Invokes做其他操作?动画在主线程上运行,如果有多线程应用程序,主线程可能会忙于更新UI上的其他内容。是的,我的应用程序是多线程的,有时也忙于更新其他UI,但即使我在没有其他UI作业的情况下在开始时也尝试了动画,它仍然有点紧张。我会在一个单独运行的新应用程序上尝试你的动画,看看是否有一些背景工作没有被注意到。你知道你的计算机是通过软件渲染还是硬件加速来做动画的吗?是的,我只是用渲染能力来测试它,而且它是硬件加速的。您是否让主线程忙于使用调用执行其他操作?动画在主线程上运行,如果有多线程应用程序,主线程可能会忙于更新UI上的其他内容。是的,我的应用程序是多线程的,有时也忙于更新其他UI,但即使我在没有其他UI作业的情况下在开始时也尝试了动画,还是有点紧张。我会在一个单独运行的新应用程序上尝试你的动画,看看是否有一些背景工作没有被注意到。谢谢你的回复。不幸的是,这没有帮助。不过,动画并不流畅。谢谢你的回复。不幸的是,这没有帮助。尽管如此,动画还是不平滑。这并没有帮助我平滑从左向右移动的简单椭圆(没有cpu/gpu负载)。我认为WPF绘图很糟糕。这并没有帮助我平滑从左向右移动的简单椭圆(没有cpu/gpu负载)。我认为WPF绘图很糟糕。