我正在为我的WPF应用程序添加一些动画效果。
感谢Dan Crevier的独特解决方案,可以对面板子元素进行动画处理,再加上WPF Penner动画库,使得我的控件看起来很棒,并且它的子元素可以通过流畅的动画移动。
不幸的是,这一切都带来了性能开销。当添加/删除项或调整控件大小时,我很高兴承受性能损失,但似乎这种性能损失会在应用程序的整个生命周期中持续存在,即使项目是完全静态的。
PanelLayoutAnimator
类使用附加属性将UIElement.LayoutUpdated
事件挂钩。当事件触发时,渲染变换会被动画处理,使得子元素可以平滑地滑动到新位置。
不幸的是,即使在应用程序闲置时(至少我认为代码没有执行任何操作 - 应用程序没有焦点,鼠标是静止的),LayoutUpdated
事件似乎每秒钟就会触发一次。由于事件处理程序无法立即确定事件的原因,因此必须重新评估控件的所有子元素。这个事件在闲置时大约每秒钟被调用一次。当实际使用应用程序时,频率会增加。
那么我的问题是,我如何提高性能? 任何有助于解决问题的答案都将不胜感激,但我目前卡在以下子问题上:
是什么导致
LayoutUpdated
事件频繁触发?这是否应该发生?如果不应该,我如何找出为什么会发生并阻止它?在处理程序内部是否有更方便的方法可以知道是否发生了可能会移动子元素的事件? 如果是这样,我可以早早退出并避免循环每个子元素所带来的开销。
目前,当面板中有超过N个子元素时,我将通过禁用动画来解决此问题。
ElementHost
。 - Drew Noakes