0

我正在将 silverlight beta 2 应用程序升级到 RC0,并具有将点从子元素转换为其父元素的功能。该函数的目的是确保元素恰好出现在子元素的顶部,即使它们不在同一个画布上并且不共享父元素。

这是当前功能:

    protected Point TranslatePosition(Point current, Panel from, Panel to, MouseEventArgs e)
    {
        Point rtn = new Point(-1, -1);
        // get point relative to existing parent
        Point fromPoint = e.GetPosition(from);
        // get point relative to new parent
        Point toPoint = e.GetPosition(to);

        // calculate delta
        double deltaX = fromPoint.X - toPoint.X;
        double deltaY = fromPoint.Y - toPoint.Y;

        // calculate new position
        rtn = new Point(current.X - deltaX, current.Y - deltaY);

        return rtn;
    }

请注意,它依赖于 MouseEventArgs.GetPosition 函数来获取相对于现有父级和新父级的位置。在没有可用的 MouseEventArgs 的情况下,我们正在创建一个新实例并将其传入。这是一个 hack,但似乎有效。现在,在 RC0 中,MouseEventArgs 构造函数是内部的,所以这个 hack 不再有效。

关于如何编写一个方法来翻译 RC0 中不依赖于 MouseEventArgs.GetPosition 的点的任何想法?

4

2 回答 2

2

请参阅框架元素的 TransformToVisual 方法。它完全符合您的要求:给定另一个控件,它会生成一个新的变换,该变换将一个点相对于当前控件的坐标映射到相对于传入控件的坐标。

var transform = from.TransformToVisual(to);
return transform.Transform(current);
于 2008-09-30T17:39:05.470 回答
0

然而,但是......呈现转换管道如何接受更新似乎存在问题,这与它在 WPF 中的工作方式不同。

我在daisley-harrison.com创建了一个 wiki 条目,然后讨论了这个问题。稍后我会在blog.daisley-harrison.com 上将其转换为博客条目。

于 2009-02-08T08:40:27.013 回答