1

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

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

Point mousePoint = Mouse.GetPosition(this);  
4

2 回答 2

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

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

于 2012-11-20T18:48:40.830 回答
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();
    }
于 2017-06-01T19:23:38.467 回答