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

时间:2010-08-10 19:53:21

标签: wpf

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

5 个答案:

答案 0 :(得分:73)

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

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

我就是这样做的,它始终将窗口完美地集中在一起。

要扩展Will Eddins所评论的内容,您可以在Window中为ShowDialog()或Show()创建一个重载方法:

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;
}

答案 1 :(得分:5)

如果您为此创建扩展程序,则可以重复使用这个好主意:

/// <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();
}

答案 2 :(得分:1)

我遇到了同样的问题...但这主要是因为当我想摆脱子窗口时,我使用了hide()而不是close() ...所以当你重新打开它时,因为它被隐藏而没有关闭,当移动父窗口时,它仍会在它的启动位置打开...

因此,当关闭子窗口而不是隐藏它时,例如在完成使用它时。

答案 3 :(得分:0)

可能导致此问题的其他原因是在调用DataContext之后设置InitializeComponent()

如果您具有这样的代码隐藏:

    public CustomWindow(CustomViewModel viewModel)
    {
        InitializeComponent();
        DataContext = viewModel;
    }

将其更改为:

    public CustomWindow(CustomViewModel viewModel)
    {
        DataContext = viewModel;
        InitializeComponent();
    }

答案 4 :(得分:0)

此外,我们可以使用:

this.Owner = App.Current.MainWindow;

或者用Application代替App
并将其放置在窗口构造器中:

    public partial class ChildWindow : Window
    {
        public ChildWindow()
        {
            InitializeComponent();

            DataContext = new ChildWindowViewModel();

            this.Owner = App.Current.MainWindow;
        }
    }