一个画面内TranslatePoint将(TranslatePoint within a Canva

2019-10-29 20:44发布

我在我的应用的滚动浏览器包含一个画布,在其中我有一个树自定义绘制的树结构。 我试图让相对滚动浏览器(这样我就可以滚动它)画布中的特定节点元素的位置,但我尝试不工作。

我已经尝试使用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.GetLeftCanvas.GetTop等人,但是这是混乱和令人费解的(因为他们不会永远是左,顶部对齐)。

我怎样才能解决这个问题呢,还是只是不适合画布工作?

Answer 1:

你已经尝试使用VisualTreeHelper.GetOffset(Visual obj) 我不是在工作室的前面,但我似乎使用的只是这样的事情在过去的回忆......



Answer 2:

我已经写了这个问题的简单的解决方法的方法。 它的工作原理,但它不是很干净,所以如果任何人有一个答案,这个我还是很感激! 下面是我目前使用的代码:

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


文章来源: TranslatePoint within a Canvas