2009-10-16 33 views
6

我一直在向我的WPF應用程序添加一些動畫。WPF - LayoutUpdated事件反覆發射

感謝Dan Crevier's unique solution to animating the children of a panelawesome WPF Penner animations相結合,結果證明我的一個控件看起來非常好,並且讓它的孩子在一些不錯的動畫中移動。

不幸的是,這一切都伴隨着性能開銷。當項目被添加/刪除或控件調整大小時,我很高興能夠獲得性能,但似乎這個perf命中會在整個應用程序的生命週期中一致地發生,即使項目是完全靜態的。

PanelLayoutAnimator類使用附加屬性來掛鉤UIElement.LayoutUpdated事件。當這個事件觸發時,渲染變換動畫會導致孩子們滑向新的位置。

不幸的是,似乎LayoutUpdated事件每秒鐘都會觸發,即使應用程序中沒有任何事情發生(至少我不認爲我的代碼執行任何操作 - 應用程序沒有焦點並且鼠標是穩定。)由於事件處理的原因並不是立即顯現的,所有的控制孩子都必須重新評估。空閒時每秒會調用一次該事件。實際使用應用程序時頻率會增加。

所以我的問題是,我該如何提高性能?任何答案,協助,將不勝感激,但我目前停留在這些子問題:

  1. 是什麼原因導致LayoutUpdated事件如此頻繁火?這是否應該發生,如果沒有,我怎麼能找出它爲什麼發射並縮小它?

  2. 在處理程序中是否有更方便的方法來知道是否發生了可能使孩子感動的事情?如果是這樣,我可以儘早擺脫困境,避免循環每個孩子的開銷。

現在我會解決此問題通過禁用動畫時,有超過ñ孩子在面板上。

+0

德魯,請你分享小的代碼示例可能重現問題? – Anvaka 2009-10-16 14:14:52

+0

是的,因爲佈局更新應該只在實際上導致佈局更新的情況下才會觸發......聽起來很明顯。 :)因爲你沒有與窗口進行交互,我不知道除了尺寸,位置或佈局轉換的動畫之外,還有什麼會觸發這個動作。 – 2009-10-16 14:41:51

+0

嗯該應用程序是相當大的。如果LayoutUpdated不應該定期發射,那麼我可以使用什麼技術來找出它爲什麼發射? – 2009-10-16 16:24:34

回答

7

如果您從附加到LayoutUpdated事件的EventHandler更新UI,這也會觸發該事件!

例如:

void my_LayoutUpdatedEvent(object sender, EventArgs e) 
    { 
     textBlock1.Text = "changed"; 
     Console.Out.WriteLine("text changed!"); 
    } 

將進入更新的無限循環。

也許你需要做這樣的事情:

void my_BetterLayoutUpdatedEvent(object sender, EventArgs e) 
    { 
     if (!hasChanged) 
      textBlock1.Text = "changed"; 
     hasChanged = true; 
     Console.Out.WriteLine("text changed!"); 
    } 
+2

有趣的一點,它使感。我不再爲這個應用程序工作,但這聽起來似乎合理。希望它能幫助別人。 – 2012-07-16 22:07:42

+0

是否可以檢查導致無效的哪個UI更新? – simo 2013-03-13 12:10:08