2011-01-22 25 views
4

另一个问题中儿童真正的“逻辑”的位置在我的WPF问题系列:)WPF:获取其父面板

我创建定制Decorator将被用来装饰Panel秒(或者也可以是行为,没有区别)。

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

这似乎很容易。但我找不到总是得到坐标坐标的方法。

此代码

VisualTreeHelper.GetOffset(child) 

当面板里面ScrollView不工作 - 它采用Panel的最顶端,最左边可见的角落为坐标空间的原点 - 而不是Panel真正的最上面和最左边的角落。

的代码时,一些渲染转换已经是Panel的子元素上的活动

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

将无法​​正常工作。它将返回子元素的变换图像的位置(通过渲染转换)。渲染位置。

同样的问题是这种形式给出:

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); 

所以这个我什么我已经tryied,但没有奏效。我在这个主题上有两个类似的问题,试图简化问题,所以我得到了上面的一些建议。现在我介绍了这个问题的全部复杂性,我希望能得到正确的建议。

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

+1

如果使用画布面板,您可以拨打Canvas.GetTop和Canvas.GetLeft确定在2D平面的顶部和左侧坐标。 – whoisthis 2011-01-22 18:10:35

+0

谢谢。但我不知道我的`Panel`是什么类型。它给了我,'装饰者'应该能够装饰任何'面板'。 – drasto 2011-01-22 18:23:36

回答

0

您可以调用TransformToAncestor之前的“撤消” RenderTransform

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