如何在鼠标位置打开具有 Windows 窗体父级的 WPF 窗口?

Posted

技术标签:

【中文标题】如何在鼠标位置打开具有 Windows 窗体父级的 WPF 窗口?【英文标题】:How to open a WPF window that has a Windows Form parent at mouse position? 【发布时间】:2012-11-08 18:35:04 【问题描述】:

我有一个 Windows 窗体窗口应用程序。在应用程序中,我们要打开一个 WPF 窗口,该窗口位于相对于鼠标位置的位置。假设窗口中心可能显示在鼠标坐标处,或者另一种情况,窗口的左上角可能设置为鼠标坐标。

我看过像 http://www.formatexception.com/2008/09/wpf-and-mouseposition/ 这样的帖子 但这对我没有帮助,因为我的窗口之前没有打开 WPF 控件。我只有 windows 窗体,所以下面的行在我的情况下不可用

Point mousePoint = Mouse.GetPosition(this);  

【问题讨论】:

窗口窗体鼠标位置对我没有帮助,因为它也没有给我需要放置在窗口顶部和左侧的 WPF 坐标。我认为缺少一些转换 【参考方案1】:

由于你有一个可用的 winforms 控件,你可以使用Control.MousePosition

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.mouseposition.aspx


您是否从 winforms 表单显示 wpf 窗口?我写了一个快速测试,它有一个带按钮的表单。单击按钮时,它会在光标位置打开一个 wpf 窗口。这很好用,在单击按钮之前我没有创建或显示任何 WPF 控件。

我尝试了设置WindowStartupLocation 和不设置WindowStartupLocation,它们都有效,但您可能值得尝试添加它。这是一个例子:

private void button1_Click(object sender, EventArgs e)

  Window w = new Window();
  w.WindowStartupLocation = WindowStartupLocation.Manual;
  w.Left = Control.MousePosition.X;
  w.Top = Control.MousePosition.Y;
  w.Show();

不过,如果上面的代码示例不适合您,那么也许您可以进一步描述您的场景并包含一些代码示例?

【讨论】:

我也已经尝试过了,但是鼠标位置似乎需要一些转换才能设置为 wpf 窗口的 TOP 和 LEFT,因为该窗口没有出现在所需的位置。我无法找到正确的转换。 MousePosition 返回屏幕坐标,因此在设置为 Window 或 Form 对象时无需进行转换。我用一个示例修改了我的答案。【参考方案2】:

根据 Bill Tarbell 的回答,您可能需要考虑 DPI 缩放:

    private Point GetScalingFactor(Window window)
    
        var zeroPoint = window.PointToScreen(new Point(0, 0));
        var hundredPoint = window.PointToScreen(new Point(100, 100));
        return new Point( 
                    100.0 / (hundredPoint.X - zeroPoint.X), 
                    100.0 / (hundredPoint.Y - zeroPoint.Y));
    

    private void ShowAtCursor(Window parent, Window toShow)
    
        var point = parent.PointToScreen(System.Windows.Input.Mouse.GetPosition(parent));
        var scaling = GetScalingFactor(parent);

        toShow.Left = point.X * scaling.X;
        toShow.Top = point.Y * scaling.Y;
        toShow.WindowStartupLocation = WindowStartupLocation.Manual;
        toShow.Show();
    

【讨论】:

以上是关于如何在鼠标位置打开具有 Windows 窗体父级的 WPF 窗口?的主要内容,如果未能解决你的问题,请参考以下文章

如何在保持垂直位置的同时使 div 与父级的右侧对齐?

如何在 Windows 窗体 C# 中伪造鼠标光标位置?

在iframe窗体内 获取父级的元素;;在父窗口中获取iframe中的元素

具有固定父级的绝对定位元素上的 z-index [重复]

javascript父级鼠标移入移出事件中的子集影响父级的处理方法

如何找到具有特定父级的元素?