0

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

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

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

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

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

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

4

1 回答 1

3

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

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

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

于 2009-10-29T17:16:51.630 回答