我有一个2监视器和一个启动WPF窗口的WinForm应用程序.我想获得WinForm所在的屏幕,并在同一屏幕上显示WPF窗口.我怎样才能做到这一点?
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();
上面的代码将在包含WinForms窗口的屏幕左上角实例化WPF窗口.如果您希望将其放在屏幕中间的其他位置或WinForms窗口右下方的"级联"样式中,我会将数学留给您.
在屏幕中间获取WPF窗口的另一种方法是简单地使用
_wpfWIndow.StartupLocation = System.Windows.WindowStartupLocation.CenterScreen
但是,这并不是那么灵活,因为它使用鼠标的位置来确定显示WPF窗口的屏幕(显然,如果用户快速移动鼠标,鼠标可以作为WinForms应用程序在不同的屏幕上,或者你使用默认按钮,或其他).
编辑:这是一个SDK文档的链接,该文档关于使用InterOp将WPF窗口置于非WPF窗口的中心.它基本上完成了我在描述数学方面所描述的内容,但正确地允许您使用Window的HWND设置WPF窗口的"Owner"属性.
这是最简单的方法(使用WindowStartupLocation.CenterOwner).
MyDialogWindow dialogWindow = new MyDialogWindow(); dialogWindow.Owner = this; dialogWindow.WindowStartupLocation = WindowStartupLocation.CenterOwner; dialogWindow.ShowDialog();
无需互操作或设置窗口坐标:)