我已经看到很多关于类似问题的问题,但我还没有找到一个非常具体到我的问题来找到答案。
我允许用户将我的程序的MainWindow移动到另一个监视器上,如果有的话。当他们点击在MainWindow上添加内容时,会创建一个新窗口,以便他们填写表单。
问题是这个新窗口将在操作系统的主屏幕上启动,而不是在MainWindow当前所在的屏幕上启动。
我看了这个问题; How to make a dialog(view) open up on the same monitor as the main window并且看到将所有者设置为MainWindow就是在这种情况下工作的。所以我添加了
Owner = Application.Current.MainWindow;
进入Window_Loaded方法的新窗口。这会将Window加载到与MainWindow相同的屏幕上但随后崩溃,并说明Cannot set Owner property after Dialog is shown.
当然,我将所有者属性的设置移动到显示新窗口之前,所以它看起来像这样;
contractAddwindow.Owner = Application.Current.MainWindow;
contractAddwindow.ShowDialog();
然而,这与之前的问题相同,contractAddWindow
在主屏幕上开始。
所以我的问题是,如何强制新窗口加载到与MainWindow相同的监视器而不是主屏幕?
答案 0 :(得分:5)
您可以使用WindowStartupLocation
:
来自XAML:
WindowStartupLocation="CenterOwner"
来自代码:
WindowStartupLocation = WindowStartupLocation.CenterOwner;
答案 1 :(得分:2)
尝试这种方法:
using System.Windows;
using System.Windows.Forms; // Reference System.Drawing
[...]
public void SetWindowScreen(Window window, Screen screen)
{
if (screen != null)
{
if (!window.IsLoaded)
{
window.WindowStartupLocation = WindowStartupLocation.Manual;
}
var workingArea = screen.WorkingArea;
window.Left = workingArea.Left;
window.Top = workingArea.Top;
}
}
public Screen GetWindowScreen(Window window)
{
return Screen.FromHandle(new System.Windows.Interop.WindowInteropHelper(window).Handle);
}
然后,从Window
的构造函数中调用它,并将其显示在与MainWindow
相同的监视器上:
SetWindowScreen(this, GetWindowScreen(App.Current.MainWindow));