0

キャンバスを含むアプリケーションにスクロール ビューアーがあり、その中にツリーのカスタム描画ツリー構造があります。スクロール ビューアに相対的なキャンバス内の特定のノード要素の位置を取得しようとしています (スクロールできるように) が、うまくいきません。

marker.TranslatePoint(new Point(0, 0), scrollViewer)(キャンバス内の要素はどこにありますか)を使用してみましmarkerたが、これはマーカーではなく、キャンバスの位置を返すだけです。同様に、 を試してみると、マーカーが実際にどこにあるかに関係なく、marker.TranslatePoint(new Point(0, 0), layoutCanvas)常に結果として得られます。(0,0)

これが私のコードです:

var marker = m_Metadata[node].Marker;
var location = marker.TranslatePoint(new Point(0, 0), scrollViewer); // This inorrectly gives the position of the canvas, rather than the marker.
var size = new Size(marker.Width, marker.Height);
var markerArea = new Rect(location, size);

double horizontalOffset = (markerArea.Right + markerArea.Left - scrollViewer.ViewportWidth) / 2;
double verticalOffset = (markerArea.Bottom + markerArea.Top - scrollViewer.ViewportHeight) / 2;

も使用してみましmarker.TransformToVisual(scrollViewer).Transform(new Point(0, 0)たが、これでも同じ結果が得られます。

Canvas.GetLeft、などを使用して回避できますCanvas.GetTopが、これは面倒で複雑です (常に左揃えと上揃えになるとは限らないため)。

どうすればこれを修正できますか、それともキャンバスでは機能しませんか?

4

2 に答える 2

1

使ってみましたVisualTreeHelper.GetOffset(Visual obj)か?私はスタジオの前ではありませんが、過去にこの種のことのためにそれを使用したことを思い出しているようです...

于 2009-12-31T21:48:22.900 に答える
1

この問題の簡単な回避策を書きました。それは機能しますが、あまりきれいではないので、誰かがこれに対する答えを持っていれば、私はまだ感謝しています! 現在使用しているコードは次のとおりです。

private static Point GetCanvasChildPosition(FrameworkElement element)
{
    var canvas = element.Parent as Canvas;

    double left = Canvas.GetLeft(element);
    double top = Canvas.GetTop(element);

    bool isLeftAligned = !double.IsNaN(left);
    bool isTopAligned = !double.IsNaN(top);

    double x;
    double y;

    if (isLeftAligned)
    {
        x = left;
    }
    else
    {
        x = canvas.Width - Canvas.GetRight(element) - element.Width;
    }

    if (isTopAligned)
    {
        y = top;
    }
    else
    {
        y = canvas.Height - Canvas.GetBottom(element) - element.Height;
    }

    return new Point(x, y);
}
于 2010-03-19T11:52:17.617 に答える