WPF:在其父面板中获取Child的真正“逻辑”位置

时间:2011-01-22 17:06:29

标签: c# .net wpf wpf-controls custom-controls

我的WPF问题系列中的另一个问题:)

我正在创建用于装饰Decorator的自定义Panel(或者它可以是行为,没有区别)。

Decorator处理PanelChildren的{​​{1}}属性中的元素。它将一些Panel附加到这些元素上。现在我需要一个相对于RenderTransform本身的元素(Panel的'子')的位置。换句话说,如果Panel坐标空间中有一些子元素,我需要一个位置。换句话说,我想在Panel上调用ArrangeOverride方法时Panel Arrange方法指定的偏移量。

这似乎很容易。但我无法找到始终获得正确坐标的方法。

此代码

Children
当面板位于VisualTreeHelper.GetOffset(child) 内时,

不起作用 - 它将ScrollView的最顶部,最左侧可见角作为坐标空间的原点 - 而不是{{1}的真实最顶端和最左侧角落}}

代码

Panel
Panel的子元素上的某些渲染变换已经处于活动状态时,

将无效。它将返回子元素的变换图像的位置(通过渲染变换)。渲染位置。

同样的问题是这个问题:

Point position = child.TransformToAncestor(panel).Transform(new Point(0,0));

所以这就是我所尝试的但是它没有用。我有两个关于这个主题的类似问题,它们正在努力简化问题,所以我得到了一些上面的建议。现在我以完全复杂的方式介绍了这个问题,我希望得到正确的建议。

如果不清楚,请留下评论。 谢谢

1 个答案:

答案 0 :(得分:0)

您可以在致电RenderTransform之前“撤消”TransformToAncestor

Point origin = child.RenderTransform.Inverse.Transform(new Point(0, 0));
Point position = child.TransformToAncestor(listBox).Transform(origin);