【问题标题】:How to open a WPF window that has a Windows Form parent at mouse position?如何在鼠标位置打开具有 Windows 窗体父级的 WPF 窗口?
【发布时间】: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 坐标。我认为缺少一些转换

标签: wpf window mouse


【解决方案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();
    }

【讨论】:

    猜你喜欢
    • 2015-02-12
    • 2013-04-01
    • 2012-05-31
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2014-11-03
    相关资源
    最近更新 更多