Dot-Net
WPF - 重複觸發 LayoutUpdated 事件
我一直在為我的 WPF 應用程序添加一些動畫。
多虧了Dan Crevier 獨特的解決方案來為面板的子級設置動畫,並結合了令人敬畏的 WPF Penner 動畫,結果證明讓我的一個控制項看起來很棒並讓其子級通過一些漂亮的動畫移動非常簡單。
不幸的是,這一切都帶來了性能成本。我很高興在添加/刪除項目或調整控制項大小時對性能造成影響,但似乎這種性能影響在應用程序的整個生命週期中始終如一地發生,即使項目完全是靜態的。
該類
PanelLayoutAnimator使用附加屬性來掛鉤UIElement.LayoutUpdated事件。當這個事件觸發時,渲染變換被動畫化以使孩子們滑到他們的新位置。不幸的是,事件似乎
LayoutUpdated每秒觸發一次,即使應用程序中沒有發生任何事情(至少我認為我的程式碼沒有做任何事情——應用程序沒有焦點並且滑鼠是穩定的。)作為事件的原因對於事件處理程序來說不是立即顯而易見的,因此必須重新評估控制項的所有子項。空閒時大約每秒呼叫一次此事件。實際使用應用程序時頻率會增加。所以我的問題是,我怎樣才能提高這裡的性能?任何有幫助的答案將不勝感激,但我目前被困在這些子問題上:
- 是什麼導致
LayoutUpdated事件如此頻繁地觸發?這是否應該發生,如果沒有,我怎樣才能找出它為什麼會觸發並減少它?- 處理程序中是否有更方便的方法來了解是否發生了可能讓孩子們感動的事情?如果是這樣,我可以提前退出並避免循環每個孩子的成本。
現在我將通過在面板中有N個以上的孩子時禁用動畫來解決這個問題。
如果您要從
EventHandler附加到LayoutUpdated事件的 UI 中更新 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!"); }