如何在鼠标位置打开具有 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 窗口?的主要内容,如果未能解决你的问题,请参考以下文章
在iframe窗体内 获取父级的元素;;在父窗口中获取iframe中的元素