我发现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挂钩,然后告诉故事板开始。它被循环调用,对于当前未被鼠标拖动的每个移动窗格一次。
答案 0 :(得分:0)
这是非常奇怪的行为,我的猜测是它与以下之一有关:
social.msdn: Usually smooth, lag occurring during WPF animation
与第一个链接描述类似,您可以尝试在XAML中使用CompositionTarget.Rendering
而不是Storyboard。请查看此示例:How to: Render on a Per Frame Interval Using CompositionTarget
此外,还有Morten Nielsen撰写的这篇精彩博文,解释了Silverlight和WPF之间的区别: sharpgis.net