将Silverlight beta 2更新为“TranslatePosition”的最佳方法是什么?

时间:2008-09-30 14:53:54

标签: silverlight

我正在将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可用的情况下,我们创建了一个新实例并将其传入。这是一个黑客但似乎工作。现在,在RC0中,MouseEventArgs构造函数是内部的,所以这个hack不再有效。

关于如何编写方法来完成RC0中不依赖MouseEventArgs.GetPosition的点转换的任何想法?

2 个答案:

答案 0 :(得分:2)

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

var transform = from.TransformToVisual(to);
return transform.Transform(current);

答案 1 :(得分:0)

但是......渲染转换管道如何接受与WPF中的工作方式不同的更新似乎存在问题。

我在daisley-harrison.com创建了一个wiki条目,然后讨论这个问题。当我稍后再讨论时,我会把它变成blog.daisley-harrison.com的博客条目。