WPF WindowStartupLocation = "CenterOwner" на самом деле не центр, и всплывает повсюду, почему? - PullRequest
47 голосов
/ 10 августа 2010

Ну этот вопрос и этот вопрос похожи, но ответы не работают. На самом деле я надеялся, что WindowStartupLocation = CenterOwner сработает ... это не так. Кажется, что новое окно центрируется в центре столбца сетки, а не в центре главного окна. Так что я предполагаю, что думает, что это родитель. Во-вторых, когда я закрываю диалог и открываю его снова, он не центрируется, а перемещается вниз и вправо от предыдущей позиции. И если я перенесу главное окно на второй монитор, всплывающее окно все равно откроется на мониторе по умолчанию. Являются ли эти свойства неправильными, или я просто думаю, что это должно работать по-другому. Я полагаю, я мог бы рассчитать свойства Top и Left вручную. Я просто хочу, чтобы всплывающее окно было в центре главного окна, независимо от того, где оно находится.

Ответы [ 3 ]

74 голосов
/ 10 августа 2010

Возможно, потому что вы не установили владельца:

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

Вот как я это делаю, и он постоянно центрирует окно.

Чтобы расширить то, что прокомментировал Уилл Эддинс, вы можете создать метод перегрузки для 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;
}
5 голосов
/ 28 ноября 2012

Если вы создадите расширение для этого, вы можете использовать эту прекрасную идею:

/// <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();
}
1 голос
/ 24 января 2015

У меня была такая же проблема ... но это было в основном из-за того, что, когда я хотел избавиться от дочернего окна, я использовал hide() вместо close() ... поэтому, когда вы открываете его снова , поскольку оно было скрыто и не закрыто, при перемещении родительского окна оно все равно открывается в месте его запуска ...

То есть, когда закрываете дочернее окно, а не скрываете его, например, когда закончите работу с ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...