4

假设我有这个 XAML 代码:

<DockPanel Name="pan">
    <Label Content="AAA" Name="lab1" />
    <Label Content="BBB" Name="lab2" />
    <Label Content="CCC" Name="lab3" />
</DockPanel>

我后面的代码我想找出 inside 的坐标是lab2什么pan但是,我想忽略任何当前的 RenderTransform lab2。因此,解决方案必须为上述代码和以下代码返回相同的坐标:

<DockPanel>
    <Label Content="AAA" />
    <Label Content="BBB" >
        <Label.RenderTransform>
            <TranslateTransform Y="20"/>
        </Label.RenderTransform>
    </Label>
    <Label Content="CCC" />
</DockPanel>

换句话说,我想要调用时方法ArrangeOverride设置的位置。我称之为“逻辑立场”。'视觉位置'可以通过调用以下方法获得:panArrangebut2

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

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

如果不清楚,请发表评论。

谢谢

4

2 回答 2

6

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

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

看起来它运作良好。如果您知道何时无法使用该场景,请发表评论。

于 2011-01-21T17:35:07.670 回答
3

我会得到转换,并将其转换为MatrixTransform. 然后,您可以使用 Inverse 属性来反转渲染变换。它看起来像这样:

private Point visualPoss() 
{
    Point lab2Vis = lab2.PointToScreen(new Point(0, 0));
    Point panVis = pan.PointToScreen(new Point(0, 0));

    if (lab2.RenderTransform != null)
    {
        var matrix = new MatrixTransform(lab2.RenderTransform.Value);
        lab2Vis = matrix.Inverse.Transform(lab2Vis);
    }

    return new Point(lab2Vis.X - panVis.X, lab2Vis.Y - panVis.Y);
} 
于 2011-01-21T17:26:42.323 回答