c# - 显示带有 WPF、Winforms 和双显示器的窗口

标签 c# wpf winforms multiple-monitors

我有 2 个显示器和一个启动 WPF 窗口的 WinForm 应用程序。我想获取 WinForm 所在的屏幕,并在同一屏幕上显示 WPF 窗口。我该怎么做?

最佳答案

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 应用程序位于不同的屏幕上)快速,或者您使用默认按钮,或其他)。

编辑:Here's a link to an SDK document关于使用 InterOp 使 WPF 窗口居中于非 WPF 窗口。它基本上完成了我在计算数学方面所描述的内容,但正确地允许您使用窗口的 HWND 设置 WPF 窗口的“所有者”属性。

关于c# - 显示带有 WPF、Winforms 和双显示器的窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/512398/

相关文章:

wpf - 将数据集/数据表绑定(bind)到 xaml 数据网格

wpf - XAML - MergedDictionaries 抛出 XmlParseException "item has already been added"。为什么?

c# - 如何在C#中的richtextbox中更改多种大小的字体?

c# - 从我在代码隐藏中没有引用的控件中删除 Id 标签是一种好习惯吗

c# - 从列表中删除重复项,但保留一个并进行编辑

c# - DotNetOpenAuth 和谷歌

c# - 如何访问用户控件 WinForm 中托管表单上的控件

C# 多线程 HttpWebRequest 超时.. 帮助!

wpf - 使用 VisualStateManager 动画 MVVM ViewModel 转换——动画未运行

winforms - DataGridViewComboBoxColumn 在 Windows 7+ 操作系统上的行为有所不同