将" TranslatePosition"从Silverlight Beta 2更新到RC的最佳方法是什么?

时间:2020-03-06 14:55:36  来源:igfitidea点击:

我正在将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不再起作用。

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

解决方案

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

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

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

我在daisley-harrison.com上创建了一个Wiki条目,然后讨论了这一点。稍后我将在Blog.daisley-harrison.com上将其转变为博客条目。