【问题标题】:Can give me an example that when should use UIElement.UpdateLayout()?可以举个例子说明什么时候应该使用 UIElement.UpdateLayout()?
【发布时间】:2012-04-12 02:45:32
【问题描述】:

我在 MSDN 中读到了这个 UpdateLayout() method

上面写着:

确保该元素的所有可视子元素都正确 已更新布局。

但我不明白布局没有正确更新是什么意思。

我已经使用 Silverlight/WPF 一年多了,但我仍然没有使用过这种方法。

那么有人可以给我一个需要使用这种方法的例子吗?所以我真的可以理解它的作用以及我应该在什么时候使用它?

【问题讨论】:

    标签: c# wpf silverlight user-interface


    【解决方案1】:

    如果您需要一个控件来立即完成其布局,您可能需要调用它,以便您可以基于它做一些事情。例如,您可以在子控件上调用UpdateLayout,以便它获得ActualHeightActualWidth,如果您想在此基础上做其他事情(例如定位它,或绘制具有相应大小的东西)。

    【讨论】:

    • 哦,哇,正如你所说,它确实有效!我试图动态创建一个 Grid 和一个 Button。按钮ActualHeight/ActualWidth 在我添加到网格后只有0.00,但是一旦我执行UpdateLayout 它给了我实际的价值!现在我知道我可以用什么了,谢谢! +1
    • +1 正是我所看到的;调用 UpdateLayout() 后,ActualWidth 变为可用。
    • 我今天遇到的另一个场景。在OnDropDownOpened 中,对于自定义组合框,我需要调用ItemContainerGenerator.ContainerFromItem,但它在第一次调用时返回null,并且仅在随后的OnDropDownOpened 调用中工作正常。我必须在调用 ContainerFromItem 之前添加 UpdateLayout(),然后它也开始为第一次调用工作。我知道替代解决方案是使用 VirtualizingStackPanel 关闭虚拟化,但出于性能原因我不想这样做。
    【解决方案2】:

    根据我的研究,UpdateLayout 似乎是一种非常有效的方式来更新布局上的所有控件。但是,在大多数情况下,布局系统足够智能且足够快,可以自行进行适当的更新。我读过的所有内容都让我相信,只有在您进行大量布局修改(添加控件并移动它们)并且您需要在更新堆栈的其余部分时显示一个特定的布局场景时才需要此调用完成(但是我还没有看到一个很好的例子来显示这个......正常的布局算法似乎就是那么好)。 This MSDN article on layout 应该有助于澄清事情。

    但是,从上面来看:

    UpdateLayout 方法强制进行递归布局更新,并且是 经常没有必要

    this documentation

    频繁调用 InvalidateArrange,尤其是 UpdateLayout, 如果大量元素会产生显着的性能影响 存在于 UI 中。避免调用这个方法,除非你绝对 后续调用其他 API 需要精确的布局状态 你的代码。

    最后直接回答你的问题。这主要是通过内部 UI 布局逻辑自行完成的,您很可能永远不需要使用它。综上所述,在我看来,当你确实需要使用它时会很明显(而且它不是用于线程的,包括我自己认为的)

    【讨论】:

    • 嗯...我仍然不明白你的例子。我试过你的代码,在Thread.Sleep()之前调用UpdateLayout()后UI不会更新,它与调用方法没有区别。
    • @KingChan 我已经完全更新了我的答案。经过大量研究,看起来似乎,甚至外界认为的大部分内容都是错误的。这是一种主要用于更新整个画布的方法……但几乎从不需要。
    • 感谢您的研究,所以现在我知道实际上我们不需要这种方法来修复布局是很正常的。谢谢。 +1
    【解决方案3】:

    我认为在构建控件时最常用。例如:如果在代码中您觉得添加了一个新控件或发生了某些特殊情况,您可能会调用此 UpdateLayout() 来强制重新布局控件。在某些情况下,WPF 可能会认为 UI 发生了足够的变化,因此它会自行调用控件的 UpdateLayout()。我们都会犯错...如果您发现一个控件应该“重绘”或“重新排列”其子级,您可以尝试通过调用其“UpdateLayout”来强制它“刷新”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-09
      • 2010-11-23
      • 2023-04-02
      • 2011-04-15
      • 2017-04-10
      • 2012-03-19
      • 2018-05-12
      相关资源
      最近更新 更多