我的WPF问题系列中又有一个问题 :)
我正在创建自定义Decorator
,用于装饰Panel
(或者它可以是行为,没有区别)。
那个Decorator
处理在该Panel
中的元素(Panel
的Children
属性)。它将一些RenderTransform
附加到这些元素上。现在,我需要一个元素(Panel
的'child')相对于Panel
本身的位置。换句话说,我需要一个子元素在Panel
坐标空间中的位置。换句话说,当在Children
上调用Arrange
方法时,我想要Panel
的ArrangeOverride
方法指定的偏移量。
看起来很容易。但我找不到始终获取正确坐标的方法。
这段代码:
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);
我尝试了以下方法,但没有成功。我在这个主题上有两个类似的问题,试图简化问题,所以我得到了一些上面的建议。现在我介绍了问题的全部复杂性,希望能得到正确的建议。
如果有什么不清楚的,请留下评论。谢谢。