C# 查找Wpf WindowsFormsHost中托管的Winforms控件的中心

C# 查找Wpf WindowsFormsHost中托管的Winforms控件的中心,c#,wpf,winforms,C#,Wpf,Winforms,我正在将Winforms项目转换为WPF,在转换过程中遇到了一个非常特殊的问题。请允许我解释一下。在我的项目中,我使用OpenTK,这意味着我需要在WindowsFormHost中托管GLControl。GLControl使用第一人称相机,为了让它工作,我需要计算GLControl的精确中心,当用户“环顾四周”时,我将鼠标放在该中心。以下是我在WPF中的应用程序示例: 我以前在WinForms中使用的函数是: public static Point FindCenterOfCo

我正在将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环境中托管控件的函数吗?

没关系,我找到了一个解决方案,或者至少是一个肮脏的黑客。诀窍是不要试图找到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)));
        }
该方法将光标放在控件的正确位置。如果您打算在自己的应用程序中使用这一点,我建议您尝试这两种方法,以确定哪一种适合您的需要