4

次の XAML コードがあるとします。

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

私のコードビハインドは、lab2withinの座標が何であるかを知りたいです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 に答える