一个画布中的TranslatePoint [英] TranslatePoint within a Canvas

查看:363
本文介绍了一个画布中的TranslatePoint的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的应用程序中有一个滚动查看器,它包含一个画布,其中我有一个树定制的树结构。我试图获得画布中相对于滚动查看器的特定节点元素的位置(所以我可以滚动到它),但我的尝试不工作。

I have a scroll viewer in my application that contains a canvas, in which I have a tree custom-drawn tree structure. I'm trying to get the position of a particular node element in the canvas relative to the scroll viewer (so I can scroll to it), but my attempts aren't working.

我尝试使用 marker.TranslatePoint(new Point(0,0),scrollViewer)(其中 marker 是画布中的元素),但这只是返回画布的位置,而不是标记。同样,如果我尝试 marker.TranslatePoint(new Point(0,0),layoutCanvas),我总是只是得到(0,0)

I've tried using marker.TranslatePoint(new Point(0, 0), scrollViewer) (where marker is the element in the canvas), but this is just returning the position of the canvas, rather than the marker. Similarly, if I try marker.TranslatePoint(new Point(0, 0), layoutCanvas), I invariably just get (0,0) as the result, regardless of where the marker actually is.

这是我的代码:

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

I've also tried using marker.TransformToVisual(scrollViewer).Transform(new Point(0, 0), but this gives the same results.

我可以通过使用来解决这个问题。 Canvas.GetLeft Canvas.GetTop 等,但这是混乱和褶皱(因为他们不会总是左对齐和顶对齐)

I can work around it by using Canvas.GetLeft, Canvas.GetTop et al, but this is messy and convoluted (since they won't always be left- and top-aligned).

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

How can I fix this, or does it just not work for canvases?

推荐答案

我写了一个简单的解决方法,这个问题,它的工作原理,但它不是很干净,所以如果有人有一个答案,我仍然会赞赏它!这里的代码我目前使用:

I've written a simple workaround method for this problem. It works, but it's not very clean, so if anyone has an answer to this I'd still appreciate it! Here's the code I'm currently using:

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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆