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我可以通过使用, et al来解决它Canvas.GetTop,但这很混乱且令人费解(因为它们并不总是左对齐和上对齐)。

我该如何解决这个问题,或者它只是不适用于画布?

4

2 回答 2

1

你试过使用VisualTreeHelper.GetOffset(Visual obj)吗?我不在 Studio 面前,但我似乎记得过去只是用它来做这类事情......

于 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 回答