Ну этот вопрос и этот вопрос похожи, но нет ответов, которые работают. На самом деле я надеялся, что WindowStartupLocation = CenterOwner будет работать... это не так. Кажется, центр нового окна находится в центре столбца сетки, а не в центре главного окна. Поэтому я предполагаю, что он считает, что это родитель. Во-вторых, когда я закрываю диалог и открываю его снова, он не центрируется, а перемещается вниз и вправо от предыдущей позиции. И если я переместил главное окно на второй монитор, всплывающее окно все же откроется на мониторе по умолчанию. Являются ли эти свойства неправильными или я просто думаю, что он должен работать по-другому. Я полагаю, что я мог бы вычислить свойства Top и Left вручную. Я просто хочу, чтобы всплывающее окно было сосредоточено в главном окне независимо от того, где оно находится.
WPF WindowStartupLocation = "CenterOwner" не очень центр и всплывает, почему?
Ответ 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()
... поэтому, когда вы снова открываете его, потому что он был скрыт и не закрыт, когда родительское окно перемещено, оно по-прежнему открывается в этом месте запуска...
Итак, когда закрываем дочернее окно, а не скрываем его, например, когда закончили работать с ним.