使用WPF、Winforms和双显示器显示窗口

13

我有两个显示器和一个WinForm应用程序,可以启动一个WPF窗口。 我想获取WinForm所在的屏幕,并在同一屏幕上显示WPF窗口。 我该如何做到这一点?

4个回答

14

虽然WPF没有方便的System.Windows.Forms.Screen类,但是您仍然可以使用其属性来在WinForms应用程序中完成您的任务。

假设this表示WinForms窗口,并且_wpfWindow是下面示例中引用WPF窗口的已定义变量(这将在您设置打开WPF窗口的代码处理程序中,例如一些Button.Click处理程序中):

Screen screen = Screen.FromControl(this);
_wpfWindow.StartupLocation = System.Windows.WindowStartupLocation.Manual;
_wpfWindow.Top = screen.Bounds.Top;
_wpfWindow.Left = screen.Bounds.Left;
_wpfWindow.Show();

以上代码将在屏幕左上角实例化包含WinForms窗口的WPF窗口。如果您希望将其放置在屏幕中央或以“级联”样式放置在WinForms窗口下方和右侧,则需要自行计算位置。

另一种将WPF窗口置于屏幕中央的方法是简单地使用

_wpfWIndow.StartupLocation = System.Windows.WindowStartupLocation.CenterScreen

然而,这并不太灵活,因为它使用鼠标的位置来确定在哪个屏幕上显示WPF窗口(如果用户快速移动鼠标,或者您使用默认按钮等,鼠标可能在与WinForms应用程序不同的屏幕上)。

编辑:这里有一个SDK文档链接,介绍了如何使用Interop将WPF窗口居中于非WPF窗口上。它基本上做了我描述的数学计算,但正确地允许您使用窗口的HWND设置WPF窗口的“Owner”属性。


6
这是最简单的方法(使用WindowStartupLocation.CenterOwner)。
MyDialogWindow dialogWindow = new MyDialogWindow();
dialogWindow.Owner = this;
dialogWindow.WindowStartupLocation = WindowStartupLocation.CenterOwner;

dialogWindow.ShowDialog();

不需要交互操作或设置窗口坐标 :)

3
另一种方法是:

WindowInteropHelper helper = new WindowInteropHelper(this);

this.StartupLocation = System.Windows.WindowStartupLocation.Manual;
this.Left = System.Windows.Forms.Screen.FromHandle(helper.Handle).Bounds.Left;
this.Top = System.Windows.Forms.Screen.FromHandle(helper.Handle).Bounds.Top;

this = your WPF Window...


1

你应该能够使用 System.Windows.Forms.Screen [1],并使用 FromControl 方法获取窗体的屏幕信息。然后,您可以根据要定位的屏幕来定位 WPF 窗口(顶部、左侧)。

[1] 如果您不想加载 WinForms dlls,则还可以使用 win32 MonitorFromRect 等。但是,由于您已经拥有了 WinForms API,因此您不需要支付任何内存/性能损失。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接