Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF中的快速动画_C#_.net_Wpf_Animation - Fatal编程技术网

C# WPF中的快速动画

C# WPF中的快速动画,c#,.net,wpf,animation,C#,.net,Wpf,Animation,我有一个WPF中的动画,它是不稳定的,我的WPF表单如下所示: 1280x800窗口包含一个2400x7**网格,分为3列 第1列是*宽度 第2列的宽度为148 第3列是*宽度 这使我能够使用动画,将网格的左边边距更改为~-1000,将左边的列移出屏幕,将中间的列移到最右边,然后在屏幕上平移最右边的列(将其视为2页的平移设计) 这一切都很好,但当我向左/向右滑动屏幕组件时,它们的动画速度不同,有没有一种方法可以将整个绘图空间的缓冲区翻倍,并将其全部平移到一起?或者这违背了WPF的精神。我已经

我有一个WPF中的动画,它是不稳定的,我的WPF表单如下所示:

1280x800窗口包含一个2400x7**网格,分为3列

  • 第1列是*宽度
  • 第2列的宽度为148
  • 第3列是*宽度
这使我能够使用动画,将网格的左边边距更改为~-1000,将左边的列移出屏幕,将中间的列移到最右边,然后在屏幕上平移最右边的列(将其视为2页的平移设计)


这一切都很好,但当我向左/向右滑动屏幕组件时,它们的动画速度不同,有没有一种方法可以将整个绘图空间的缓冲区翻倍,并将其全部平移到一起?或者这违背了WPF的精神。

我已经检查了您的代码,可以验证有趣的转换。但是,动画仅在向右移动时滞后

当我用彩色边框替换您的WebBrowser时,延迟消失了

因此,结论是,这里的问题是外部托管视觉的渲染速度慢。WebBrowser是一个互操作ui元素,继承自


因此,这与XAML毫无关系,我认为您仍然停留在性能上。

简单的缓冲无助于解决这个问题,因为似乎滞后不在图形中,而是在动画期间更新不同元素属性的逻辑中。不过,以下内容应该会有所帮助:

  • 单击按钮,将整个网格渲染为RenderTargetBitmap
  • 在网格上的某个矩形上绘制结果图像(RenderTargetBitmap继承自BitmapSource)
  • 隐藏实际网格
  • 设置位图动画,将隐藏网格移动到新位置
  • 显示网格
  • 隐藏位图
至于WPF的精神,它可以被称为必要的邪恶。您可以注意到WPF中的文本呈现在滚动过程中是如何变化的,例如,使用RenderTargetBitmap并没有更糟


免责声明:我没有试图重现问题,也没有阅读XAML,但上述方法自然避免了矢量图形或托管元素的所有问题。

另一种调查方法:

使用

CompositionTarget.Rendering
动画事件(根据经过的时间更改动画属性的值)。 可能的话,用

thatBigGrid.UpdateLayout();
边距是影响布局的属性。当网格的边距在动画期间更改时,排列函数将排队并执行,每个网格子元素的内部排列位置将在循环中更新。如果下一帧的渲染在这个过程的中间开始,一些元素将显示在新的位置,一些在旧的-导致干的外观。


如果确实发生了这种情况,解决方案是手动控制渲染事件,并确保在绘制之前完全更新布局。

那么您正在设置边距属性的动画?你能发布你的XAML让我看看它是如何工作的吗?好的,我很乐意听到这个!我真的没想到会有一个web控件^ ^我把它改成了elipse,但仍然看到了延迟:-/嗯,逐点绘制是一个相当大的元素,对吗?请尝试使用半径边界。尝试用任何选项替换任何一侧。正如我所说,这不是xaml,wpf渲染可能会有点慢。好吧,wpf是DirectX驱动的,它应该是自动双缓冲的。这是一个非常好的答案,虽然不是我想听到的,但它仍然回答了我的问题,加上通过渲染到缓存位图来对显示元素进行有状态锁定也不是完全不可能的,作为windows,它自己在Win7中为缩略图做了很多这方面的工作。为了我自己和其他人的利益,你能更详细地介绍一下这里正在发生的事情吗?