如何使Silverlight动画/应用程序在WPF中也能正常工作
本文关键字:常工作 工作 动画 Silverlight 何使 应用程序 WPF | 更新日期: 2023-09-27 18:00:59
我发现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会迅速移动到你真正放置鼠标的位置。此外,很快其他pod的动画就会开始看起来很糟糕(就像图形驱动程序不堪重负一样(。
为什么wpf和silverlight之间对于相同的xaml和代码的行为如此不同,以及我如何让wpf以与原始silverlight代码相同的方式进行动画制作?
以下是我为使WPF版本正常工作所做的更改。
因此,首先我按照他们在Silverlight上的方式创建了所有内容,当我第一次启动它时,它给了我一个错误:
{"'System.Windows.Media.Manimation.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动画对象,将其与吊舱挂钩,然后告诉故事板开始。它被循环调用,对于当前没有被鼠标拖动的每个移动吊舱调用一次。
这真的很奇怪,我猜这与以下其中一个有关:
social.msdn:通常是平滑的,在WPF动画期间出现滞后
AllowTransparency问题
与第一个链接所描述的一样,您可以尝试在XAML中使用CompositionTarget.Rendering
而不是情节提要。看看这个例子:如何:使用CompositionTarget 在每帧间隔上渲染
此外,Morten Nielsen写了一篇很好的博客文章,解释了Silverlight和WPF之间的区别:sharpgis.net