【发布时间】:2023-03-05 00:29:01
【问题描述】:
我发现 Silverlight 仪表板演示效果很好 @http://blog.allaboutprogress.com/2010/04/silverlight-dashboards-part-i/
但是,我想让应用程序在 WPF 中工作。我在 Silverlight 中创建了项目并让它运行,然后将文件复制到 WPF 应用程序中。
经过一个小的调整后,我让它工作了,基本上是相同的方式,但动画与 Silverlight 版本相比看起来很糟糕。
1) 在 Silverlight 中,无论表格有多大,一切都可以顺畅地移动。在 WPF 中,当有太多动画进行时,动画会变得不稳定,并且随着包含的窗口越大,效果也会越差。
2) 在 Silverlight 中,被拖动的 pod 和其他需要避开的 pod 都可以流畅地进行动画处理。在 wpf 中,当您拖动鼠标时,正在移动的 pod 不会移动,但是当您拖动鼠标时,其他 pod 仍然会避开。然后,当您松开鼠标时,吊舱会快速移动到您松开鼠标的位置。此外,其他 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 挂钩,然后告诉 storyboard 开始。它在一个循环中调用,对于当前未被鼠标拖动的每个移动 pod 调用一次。
【问题讨论】:
标签: c# wpf animation silverlight-4.0