WPF WindowStartupLocation =“CenterOwner”不是真正的中心,并且popup全部,为什么?

那么这个问题和这个问题是相似的,但没有工作的答案。 事实上,我希望WindowStartupLocation = CenterOwner会工作…它不。 它似乎将新窗口居中在网格列的中心,而不是主窗口的中心。 所以我假设它认为这是父母。 第二,当我closures对话框并再次打开它时,它不居中,而是从上一个位置向下移动。 如果我将主窗口移到第二个监视器,popup窗口仍然在默认监视器上打开。 这些属性是错误的还是我只是认为它应该以不同的方式工作。 我想我可以手动计算Top和Left属性。 我只想popup窗口在主窗口中居中,不pipe在哪里。

可能是因为你没有设置所有者:

this.Owner = App.MainWindow; // for example 

我就是这么做的,而且它总是把窗户完美地放在窗户的中央。

为了扩展Eddins的评论,你可以在你的Window中为ShowDialog()或Show()创build一个重载方法:

 public void ShowDialog(Window owner) { this.Owner = owner; this.ShowDialog(); } public void Show(Window owner) { this.Owner = owner; this.Show(); } 

或者重载构造函数:

 public MyWindow(Window owner) : this() { this.Owner = owner; } 

如果你为此创build一个扩展,你可以重用这个好主意:

 /// <summary> /// Opens a window modally, with an owner /// </summary> /// <param name="window">The window to open</param> /// <param name="opener">The owner of the window getting opened</param> /// <returns>window.ShowDialog()</returns> public static bool? ShowDialog(this Window window, Window opener) { window.Owner = opener; return window.ShowDialog(); } 

我有同样的问题…但这主要是因为,当我想摆脱子窗口,我用hide()而不是close() …所以当你重新打开它,因为它被隐藏,并没有closures,当父窗口移动,它仍然打开它的启动位置…

所以当closures子窗口而不是隐藏它时,例如当完成它的工作。