2009-10-29 73 views
0

我正在写一个WPF用户控件(PARENT),它可以包含多个子对象(CHILD)用户控件。我将(CHILD)控件与多段线连接起来。如何“插入”WPF渲染周期以从VisualTreeHelper获得准确的结果?

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

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

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

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

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

+0

不确定我提供了一个更好的选项,但您可以在加载优先级(正好在渲染优先级下方)向调度程序分派一个操作,以确保渲染完成。查看我的帖子了解更多信息:http://www.japf.fr/2009/10/measure-rendering-time-in-a-wpf-application/ – japf 2009-10-29 15:54:59

回答

3

尝试覆盖父控件上的ArrangeOverride或OnRender。 WPF执行三阶段布局/渲染过程:首先,它会询问控件需要多少空间(度量),然后它会告诉控件给出接收(排列)的所有请求实际上有多少空间,然后它实际上绘制了每个控件给予(渲染)的区域内的所有内容。为此,它遵循可视化树 - 根元素(比如说窗口)被告知要测量;它必须要求孩子在整个事情开始返回到根部之前,先测量,谁要问他们的孩子等,直到叶子元素。然后它开始安排通行证,最后通过渲染通行证。

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

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