我正在将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的点转换的任何想法?
答案 0 :(得分:2)
请参阅框架元素的TransformToVisual方法。它完全符合您的要求:给定另一个控件,它会生成一个新的变换,将点相对于当前控件的坐标映射到相对于传入控件的坐标。
var transform = from.TransformToVisual(to);
return transform.Transform(current);
答案 1 :(得分:0)
但是......渲染转换管道如何接受与WPF中的工作方式不同的更新似乎存在问题。
我在daisley-harrison.com创建了一个wiki条目,然后讨论这个问题。当我稍后再讨论时,我会把它变成blog.daisley-harrison.com的博客条目。