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

Ras*_*sto 5 .net c# wpf custom-controls wpf-controls

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

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

Decorator涉及那个Panel(Children属性)中的元素Panel.它将一些RenderTransform内容附加到这些元素上.现在我需要一个Panel相对于它Panel自身的元素('child' )的位置.换句话说,如果Panels坐标空间中有一些子元素,我需要一个位置.换句话说,我想要通过when调用方法的ArrangeOverride方法指定的偏移量.PanelArrangeChildren

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

这段代码

VisualTreeHelper.GetOffset(child)
Run Code Online (Sandbox Code Playgroud)

当面板在里面时ScrollView它不起作用- 它Panel作为坐标空间的原点 - 而不是真正的最顶端和最左边的角落 - 位于最顶部,最左边的可见角落Panel.

代码

Point position = child.TransformToAncestor(panel).Transform(new Point(0,0));
Run Code Online (Sandbox Code Playgroud)

当某些渲染变换在子元素上已经激活时,它将不起作用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);
Run Code Online (Sandbox Code Playgroud)

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

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

Ric*_*key 0

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

Point origin = child.RenderTransform.Inverse.Transform(new Point(0, 0));
Point position = child.TransformToAncestor(listBox).Transform(origin); 
Run Code Online (Sandbox Code Playgroud)