如何在WPF中使Silverlight动画/应用程序也能正常工作?

时间:2011-07-01 20:31:47

标签: c# wpf animation silverlight-4.0

我发现Silverlight仪表板演示效果很好@ http://blog.allaboutprogress.com/2010/04/silverlight-dashboards-part-i/

但是,我想让应用程序在WPF中运行。我在Silverlight中创建了项目并让它运行,然后将文件复制到WPF应用程序中。

经过一次小小的调整后,我的工作方式基本相同,但与Silverlight版本相比,动画看起来很糟糕。

1)在银色光线下,无论形状有多大,一切都会顺畅地移动。在WPF动画中,当有很多动画进行时,动画变得不稳定,并且在包含窗口越大时,动画也会越来越差。

2)在Silverlight中,正在拖动的pod和其他需要获得平滑动画的pod。在wpf中,当您拖动鼠标时移动的窗格不会移动,但是当您拖动鼠标时其他窗格仍然会移开。然后,当您重新启动鼠标时,窗格会快速移动到您放置鼠标的位置。此外,它不需要很长时间,其他pod的动画开始变坏(如图形驱动程序不堪重负)。

为什么wpf和silverlight之间的相同xaml和代码的行为完全不同,我如何让WPF以与原始Silverlight代码相同的漂亮方式制作动画?

这是我为使WPF版本发挥作用而必须做出的改变。

所以首先我按照他们在Silverlight上的方式创建了所有内容,当我第一次启动时它给了我一个错误:

{“'System.Windows.Media.Animation.DoubleAnimation'不能使用'NaN'的默认原点值。”}

所以,我通过更新

来解决这个问题
void TranslateAnimation(UIElement element, double newLeft, double newTop, double ts)

方法,在方法开头使用以下代码:

void TranslateAnimation(UIElement element, double newLeft, double newTop, double ts)
  {
   if (double.IsNaN(Canvas.GetLeft(element)))
   {
    element.SetValue(Canvas.LeftProperty, Convert.ToDouble(0));
   }

   if (double.IsNaN(Canvas.GetTop(element)))
   {
    element.SetValue(Canvas.TopProperty, Convert.ToDouble(0));
   }
   ...

这使得代码可以启动/运行而不会崩溃。

此方法创建Storyboard和Double动画对象,将其与pod挂钩,然后告诉故事板开始。它被循环调用,对于当前未被鼠标拖动的每个移动窗格一次。

1 个答案:

答案 0 :(得分:0)

这是非常奇怪的行为,我的猜测是它与以下之一有关:

social.msdn: Usually smooth, lag occurring during WPF animation

AllowTransparency problem

与第一个链接描述类似,您可以尝试在XAML中使用CompositionTarget.Rendering而不是Storyboard。请查看此示例:How to: Render on a Per Frame Interval Using CompositionTarget

此外,还有Morten Nielsen撰写的这篇精彩博文,解释了Silverlight和WPF之间的区别: sharpgis.net