Подтвердить что ты не робот

WPF WindowStartupLocation = "CenterOwner" не очень центр и всплывает, почему?

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

4b9b3361

Ответ 1

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

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

То, как я это делаю, и он отлично центрирует окно.

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

Ответ 2

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

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

Ответ 3

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

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