代码之家  ›  专栏  ›  技术社区  ›  Drew Noakes

wpf-layoutupdated事件重复触发

  •  8
  • Drew Noakes  · 技术社区  · 15 年前

    我在WPF应用程序中添加了一些动画。

    多亏了 Dan Crevier's unique solution to animating the children of a panel awesome WPF Penner animations 结果证明,让我的一个控件看起来很好,让它的孩子们用一些漂亮的动画来移动是相当简单的。

    不幸的是,所有这些都会带来性能开销。当添加/删除项或调整控件的大小时,我很高兴性能会受到影响,但似乎在应用程序的整个生命周期中,即使项是完全静态的,这种性能影响也会持续发生。

    这个 PanelLayoutAnimator 类使用附加属性挂接 UIElement.LayoutUpdated 事件。当此事件触发时,渲染变换将被设置为动画,以使子对象滑动到其新位置。

    不幸的是,似乎 LayoutUpdated 事件每秒钟触发一次,即使应用程序中没有发生任何事情(至少我不认为我的代码在做任何事情——应用程序没有焦点,鼠标稳定。)由于事件的原因对于事件处理程序来说不是很明显,因此必须重新评估控件的所有子级。此事件在空闲时大约每秒调用一次。实际使用应用程序时,频率会增加。

    所以我的问题是,我如何才能提高这里的表现?任何有助于我的回答都将不胜感激,但我目前仍停留在以下子问题上:

    1. 是什么原因造成的? 分层整理 如此频繁的火灾事件?这是应该发生的吗?如果不是的话,我怎么能找出它为什么要开火和减少它呢?

    2. 处理程序中是否有更方便的方法来了解是否发生了可能会移动孩子的事情?如果是这样的话,我可以早点跳伞,避免给每个孩子打圈。

    现在,我将通过禁用动画来解决这个问题 n 小组中的孩子们。

    1 回复  |  直到 12 年前
        1
  •  8
  •   Chris    12 年前

    如果您正在从附加到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!");
        }