显示带有WPF,Winforms和双显示器的窗口

Not*_*Dan 12 c# wpf multiple-monitors winforms

我有一个2监视器和一个启动WPF窗口的WinForm应用程序.我想获得WinForm所在的屏幕,并在同一屏幕上显示WPF窗口.我怎样才能做到这一点?

Adr*_*ian 14

WPF不包括方便的System.Windows.Forms.Screen类,但您仍然可以使用其属性在WinForms应用程序中完成任务.

假设意味着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();
Run Code Online (Sandbox Code Playgroud)

上面的代码将在包含WinForms窗口的屏幕左上角实例化WPF窗口.如果您希望将其放在屏幕中间的其他位置或WinForms窗口右下方的"级联"样式中,我会将数学留给您.

在屏幕中间获取WPF窗口的另一种方法是简单地使用

_wpfWIndow.StartupLocation = System.Windows.WindowStartupLocation.CenterScreen
Run Code Online (Sandbox Code Playgroud)

但是,这并不是那么灵活,因为它使用鼠标的位置来确定显示WPF窗口的屏幕(显然,如果用户快速移动鼠标,鼠标可以作为WinForms应用程序在不同的屏幕上,或者你使用默认按钮,或其他).

编辑:这是一个SDK文档的链接,该文档关于使用InterOp将WPF窗口置于非WPF窗口的中心.它基本上完成了我在描述数学方面所描述的内容,但正确地允许您使用Window的HWND设置WPF窗口的"Owner"属性.


Sim*_*win 6

这是最简单的方法(使用WindowStartupLocation.CenterOwner).

MyDialogWindow dialogWindow = new MyDialogWindow();
dialogWindow.Owner = this;
dialogWindow.WindowStartupLocation = WindowStartupLocation.CenterOwner;

dialogWindow.ShowDialog();
Run Code Online (Sandbox Code Playgroud)

无需互操作或设置窗口坐标:)