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

时间:2012-11-20 16:22:43

标签: wpf window mouse

我有一个Windows窗体窗口应用程序。在应用程序内部,我们想要打开一个位于相对于鼠标位置的位置的WPF窗口。假设窗口中心可以显示在鼠标坐标或其他情况下,窗口的左上角可以设置为鼠标坐标。

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

Point mousePoint = Mouse.GetPosition(this);  

2 个答案:

答案 0 :(得分:1)

由于您有可用的winforms控件,因此可以使用Control.MousePosition

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


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

我尝试使用和不设置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();
}

但是,如果上面的代码示例对您不起作用,那么您可能会进一步描述您的场景并包含一些代码示例吗?

答案 1 :(得分:0)

根据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();
    }