我正在将Winforms项目转换为WPF,这样做我遇到了一个非常特殊的问题。请允许我解释一下。在我的项目中我使用的是OpenTK,这意味着我需要在WindowsFormHost中托管GLControl。 GLControl使用第一人称相机,为了工作,我需要计算GLControl的确切中心,这是我在用户“环顾四周”时放置鼠标的地方。以下是我在WPF中的应用程序示例:
我以前在WinForms中使用过的函数是:
public static Point FindCenterOfControl(Form parent, Control control)
{
Point location = parent.PointToScreen(control.Location);
return new Point(location.X + control.Width / 2, location.Y + control.Height / 2);
}
但很自然,这在WPF中不起作用。我已经尝试了各种参数,但是我一直在崩溃,主要来自我的GLControl,当它在WPF应用程序中托管时显然不再使用“Location”属性。所以,坦率地说,我不知道如何做到这一点。
另外请注意,只要我猜中心应该在哪里,我的代码就会起作用。我可以移动相机,它看起来很好。当我调整窗口大小时会出现问题,因为那时中心远离它应该的位置,而我的第一人称相机会弹道。我需要一种方法来复制我之前在WPF应用程序中计算控件绝对中心的函数。
有没有人有任何想法如何将我的旧函数转换为支持WPF环境中托管控件的东西?
答案 0 :(得分:0)
没关系,我找到了一个解决方案,或者至少......一个肮脏的黑客也许。诀窍是不要试图找到我的GLControl的中心,而是找到WindowsFormsHost的中心。这是我的代码,以便将来可以帮助其他人。
public Point FindCenter()
{
System.Windows.Point relativePoint = _host.TransformToAncestor(_parent).Transform(new System.Windows.Point(0, 0));
return new Point((int) (relativePoint.X + _host.ActualWidth / 2), (int) (relativePoint.Y + _host.ActualHeight / 2));
}
<强> 更新 强>
事实证明,上述方法实际上是错误的。无论窗口大小或位置如何,它都将光标对准预定义的位置。这个位置错了。然而,我制作了一种新方法,可以得到理想的结果。
public Point FindCenter()
{
System.Windows.Point relativePoint = _host.PointToScreen(new System.Windows.Point(0, 0));
return new Point((int)(relativePoint.X + (this.Width/2)), (int)(relativePoint.Y + (this.Height/2)));
}
该方法将光标置于控件的正确位置。如果您要在自己的应用程序中使用它,我建议您尝试确定哪一个适合您的需求。