【问题标题】:How can you "plug into" the WPF rendercycle to get accurate results from VisualTreeHelper?如何“插入”WPF 渲染周期以从 VisualTreeHelper 获得准确的结果?
【发布时间】:2009-10-29 15:34:10
【问题描述】:

我目前正在编写一个 WPF 用户控件 (PARENT),它可以包含多个子 (CHILD) 用户控件。我正在用折线连接 (CHILD) 控件。

为此,我需要 CHILD 用户控件的位置。 但是,我从 VisualTreeHelper.GetOffset 获得的位置为零。 WPF 可能还没有完成调整大小并将 CHILD 控件放置在内存中,因为当我将代码放入控件的 OnLoaded 事件处理程序中时,我确实获得了子控件的正确位置。

这是一个问题,因为即使在我加载了 PARENT 控件之后,我仍然希望能够添加 CHILD 控件并更新我的行。

我目前解决这个问题的方法是覆盖我的 CHILD 控件的 OnRender 并为我的 MAIN 控件引发一个事件,以便它知道它可以使用 VisualTreeHelper 来获取正确的值。

然而,这意味着我需要重新绘制线条,直到最后一个 CHILD 控件完成渲染。

我当前的解决方案感觉更像是一种解决方法而不是解决方案。如何“插入”WPF 渲染周期以从 VisualTreeHelper 获得准确的结果?

【问题讨论】:

标签: wpf rendering render visualtreehelper


【解决方案1】:

尝试在父控件上覆盖 ArrangeOverride 或 OnRender。 WPF 执行三阶段布局/渲染过程:首先,它询问控件它们需要多少空间(测量),然后它告诉控件它们实际上已经为接收到的所有请求提供了多少空间(排列),然后它实际上在给定每个控件的区域内绘制所有内容(渲染)。为此,它遵循可视化树——告诉根元素(例如,Window)进行测量;在整个事情开始一直回到根之前,它必须要求它的孩子进行测量,他们必须一直询问他们的孩子等等,一直到叶子元素。然后它开始排列通道,最后是渲染通道。

通过观看孩子的 OnRender,您隐含地说您想在测量和排列发生后开始绘制,但在父开始绘制之前。这可以等同于父母的 OnRender - 它包装了孩子的 OnRender。您也可以在父级的 ArrangeOverride 中执行此操作,它包装了子级的排列通道,这是 (IIRC) VisualTreeHelper.GetOffset() 访问的值实际设置的位置。

最后,通过查看父控件,您正在隐式等待所有子控件完成排列/渲染 - 这意味着您不必四处寻找最后一个子控件何时完成渲染.

【讨论】:

    猜你喜欢
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多