2011-07-01 62 views
2

我發現很棒的Silverlight儀表板演示@http://blog.allaboutprogress.com/2010/04/silverlight-dashboards-part-i/如何讓Silverlight動畫/應用程序在WPF中同樣工作?

但是,我想讓應用程序在WPF中工作。我在Silverlight中創建了該項目,並讓它運行,然後將這些文件複製到WPF應用程序中。

經過小小的調整後,我得到了它的工作方式,基本上是一樣的方式,但與Silverlight版本相比,動畫看起來很糟糕。

1)在silverlight中,無論表格大小如何,一切都能平穩地移動。在WPF動畫中,當有很多動畫正在進行時,動畫會變得不穩定,而且包含窗口越大,動畫的表現也越差。

2)在Silverlight中,正在拖動的吊艙以及需要順利進行動畫製作的其他吊艙。在wpf中,拖動鼠標時移動的窗格不會移動,但當您拖動鼠標時,其他窗格仍然不起作用。然後,當您放開鼠標時,吊艙會快速移動到您將鼠標重新放置在的位置。另外,其他豆莢的動畫開始看起來很糟糕(比如圖形驅動程序不堪重負)並不需要很長時間。

爲什麼行爲對於wpf和silverlight之間的相同xaml和代碼如此根本不同,以及如何讓WPF以與原始Silverlight代碼相同的美麗方式進行動畫製作?

下面是我爲了讓WPF版本正常工作所做的更改。

首先,我創造了一切,他們這樣做是對Silverlight的道路,它給了我一個錯誤,當我第一次開始吧:

{「‘System.Windows.Media.Animation.DoubleAnimation’不能使用默認原點'的NaN'「}的值

所以,我固定的通過更新

void TranslateAnimation(UIElement element, double newLeft, double newTop, double ts) 

方法,其中在所述方法的開始follwoing代碼:

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動畫對象,將其與一個窗格掛鉤,然後告知故事板開始。它在一個循環中被調用,每個移動的莢目前都不會被鼠標拖動。

+0

也注意到這一點。 – NestorArturo

回答

0

這真是奇怪的行爲,我的猜測是它有事情做與下列之一:

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

AllowTransparency problem

像第一個鏈接描述,您可以嘗試使用CompositionTarget.Rendering代替XAML中的故事板。檢查這個例子了:How to: Render on a Per Frame Interval Using CompositionTarget

此外,還有由Morten Nielsen的這個漂亮的博客文章這也解釋了Silverlight和WPF之間的差異: sharpgis.net

相關問題