WPF:获取子UIElement在其父级中的位置.忽略RenderTransform(如果有)

Ras*_*sto 4 .net wpf controls panel rendertransform

假设我有这个XAML代码:

<DockPanel Name="pan">
    <Label Content="AAA" Name="lab1" />
    <Label Content="BBB" Name="lab2" />
    <Label Content="CCC" Name="lab3" />
</DockPanel>
Run Code Online (Sandbox Code Playgroud)

我在我后面的代码我想找出是什么的坐标lab2范围内pan.Hovewer我想忽略任何现有的RenderTransform lab2.因此,解决方案必须返回上述代码的相同坐标,并遵循:

<DockPanel>
    <Label Content="AAA" />
    <Label Content="BBB" >
        <Label.RenderTransform>
            <TranslateTransform Y="20"/>
        </Label.RenderTransform>
    </Label>
    <Label Content="CCC" />
</DockPanel>
Run Code Online (Sandbox Code Playgroud)

换句话说我想这是在设定的位置ArrangeOverride的方法pan调用时Arrangebut2.我称之为"合乎逻辑的位置".通过调用以下方法可以获得"视觉位置":

private Point visualPoss() {
    Point lab2Vis = lab2.PointToScreen(new Point(0, 0));
    Point panVis = pan.PointToScreen(new Point(0, 0));
    return new Point(lab2Vis.X - panVis.X, lab2Vis.Y - panVis.Y);
} 
Run Code Online (Sandbox Code Playgroud)

但这不是我的问题的解决方案,因为visualPoss()对于上面的两个XAML代码示例,它的返回值不相等.

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

谢谢

Ras*_*sto 6

看起来有一个非常简单明了的解决方案:

private Point logicalPoss() {
    Vector vec = VisualTreeHelper.GetOffset(lab2);
    return new Point(vec.X, vec.Y);
}
Run Code Online (Sandbox Code Playgroud)

看起来它运作良好.如果你知道它不会起作用,请发表评论.