【问题标题】:Finding the Center of a Winforms Control hosted in a Wpf WindowsFormsHost查找托管在 Wpf WindowsFormsHost 中的 Winforms 控件的中心
【发布时间】:2015-12-28 10:18:51
【问题描述】:

我正在将 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 中不起作用。我尝试了各种参数,但我不断收到 null 崩溃,主要来自我的 GLControl,当它托管在 WPF 应用程序中时,它显然不再使用“Location”属性。所以,坦率地说,我不知道如何做到这一点。

另外一点,只要我猜到中心应该在哪里,我的代码就可以工作。我可以移动相机,它看起来很好。当我调整窗口大小时,问题就出现了,因为中心离它应该在的位置很远,而且我的第一人称相机会弹道。我需要一种方法来复制我之前在 WPF 应用程序中计算控件绝对中心的函数。

有没有人知道如何将旧功能转换为支持 WPF 环境中托管控件的功能?

【问题讨论】:

    标签: c# wpf winforms


    【解决方案1】:

    没关系,我找到了解决方案,或者至少......也许是一个肮脏的黑客。诀窍是不要试图找到我的 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)));
            }
    

    该方法确实将光标放在控件上的正确位置。如果您要在自己的应用程序中使用它,我建议您同时尝试确定哪一个适合您的需求。

    【讨论】:

      猜你喜欢
      • 2013-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      • 1970-01-01
      相关资源
      最近更新 更多