WPF:获取子元素在父面板中的真实“逻辑”位置

5

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

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

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

看起来很容易。但我找不到始终获取正确坐标的方法。

这段代码:

VisualTreeHelper.GetOffset(child)

当面板位于ScrollView内部时,此方法将无法正常工作 - 它会将Panel的最顶部、最左侧可见角落作为坐标空间的原点,而不是Panel的实际最顶部和最左侧角落。

代码如下:

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

当某些渲染变换已经在Panel的子元素上生效时,该方法将无法工作。它将返回子元素被渲染变换后的图像位置。即渲染位置。

这种方法也存在同样的问题:

Point panelPosition = panel.PointToScreen(new Point(0, 0));
Point childPosition = child.PointToScreen(new Point(0, 0));
Point position = new Point(childPosition.X - panelPosition.X, childsPosition.Y - panelPosition.Y);

我尝试了以下方法,但没有成功。我在这个主题上有两个类似的问题,试图简化问题,所以我得到了一些上面的建议。现在我介绍了问题的全部复杂性,希望能得到正确的建议。

如果有什么不清楚的,请留下评论。谢谢。


1
如果您使用 Canvas 面板,可以调用 Canvas.GetTop 和 Canvas.GetLeft 来确定 2D 平面上的顶部和左侧坐标。 - Bhupendra
谢谢。但我不知道我的“Panel”是什么类型。它是给我的,所以“Decorator”应该能够装饰任何“Panel”。 - Rasto
好的,我现在不确定,但如果有帮助的话,请查看这个链接:https://dev59.com/TFPTa4cB1Zd3GeqPkpqv - Bhupendra
@bjoshi:这是我在这个问题中提到的一个关于这个主题的问题。可惜,它没有帮助 :( - Rasto
1
这个问题能否按照 https://dev59.com/rHI-5IYBdhLWcg3wTWZu 中所述的方法解决? - Richard J Foster
1个回答

0

在调用TransformToAncestor之前,您可以"撤销"RenderTransform:

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

遗憾的是这也不起作用。TransformToAncestor 的起始坐标系应该是左上角可见的角落... - Rasto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接