我有一个2监视器和一个启动WPF窗口的WinForm应用程序。我想获取WinForm所在的屏幕,并在同一屏幕上显示WPF窗口。我怎样才能做到这一点?显示WPF,Winforms和双监视器的窗口
回答
WPF不包含方便的System.Windows.Forms。 Screen class,但仍然可以使用它的属性在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应用程序位于不同的屏幕上)。
编辑:Here's a link to an SDK document关于使用InterOp让您的WPF窗口集中在非WPF窗口。它基本上是我在描述数学方面所描述的,但正确地允许您使用Window的HWND设置WPF窗口的“所有者”属性。
您应该可以使用System.Windows.Forms.Screen [1],并使用FromControl方法获取表单的屏幕信息。然后,您可以根据您试图找到的屏幕来定位WPF窗口(顶部,左侧)。
[1]如果您不加载WinForms dll,也可以使用win32 MonitorFromRect等。但是,由于您已经获得了winforms API,因此您不会支付任何内存/ perf命中。
以下是最简单的方法(使用WindowStartupLocation.CenterOwner)。
MyDialogWindow dialogWindow = new MyDialogWindow();
dialogWindow.Owner = this;
dialogWindow.WindowStartupLocation = WindowStartupLocation.CenterOwner;
dialogWindow.ShowDialog();
无需互操作或设置窗口COORDS :)
做的另一种方法是:
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;
此=您的WPF窗口...
- 1. 显示WPF窗口
- 2. WPF显示窗口
- 3. 双显示器父子窗口问题
- 4. 检测哪个监视器显示窗口
- 5. 从WinForms表单显示WPF窗口是绝对安全的吗?
- 6. Process.Start和双监视器
- 7. 净/的WinForms,双显示器 - 无边界窗口 - 最大化不起作用
- 8. WPF窗口显示空白
- 9. 如何从WPF窗口显示Winforms对话框?
- 10. 任务栏前面的WPF窗口(使用双显示器),我该怎么做?
- 11. 在第二个监视器/电视下的主WPF窗口的屏幕截图
- 12. 监视器窗口(屏幕截图)
- 13. WPF vs Winforms中的窗口透明度
- 14. 窗口显示WPF中的事件?
- 15. 显示从System.Configuration.Install.Installer类的WPF窗口
- 16. 显示DirectX游戏的WPF窗口ontop
- 17. 多显示器/双显示器系统上的window.open() - 窗口在哪里弹出?
- 18. VBA代码监视任务管理器中显示的窗口过程
- 19. 监视Eclipse窗口接受
- 20. 监视ForwardedEvents窗口日志
- 21. 从WinForms创建WPF窗口BackgroundWorker
- 22. 在WPF窗口中嵌入WinForms图形
- 23. 托管Win32,WinForms或WPF窗口?
- 24. 如何通过双显示器扩展Chromebook上的窗口?
- 25. 在双显示器上的Chrome Javascript弹出窗口关闭
- 26. WPF:使用XAML显示新窗口
- 27. 按名称显示WPF窗口
- 28. WPF - 无法在窗口中显示ObservableCollection
- 29. 在Application_Startup中显示窗口。 Wpf
- 30. C#WPF窗口不显示元素