将" 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上将其转变为博客条目。