Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WPF WindowStartupLocation="CenterOwner" not really center, and pops all over, why?

Tags:

wpf

Well this question and this question are similar but no answers that work. In fact I was hoping WindowStartupLocation=CenterOwner would work...it doesn't. It seems to center the new window in the center of a grid column, not the center of the main window. So I'm assuming it thinks that is the parent. Second when I close the dialog and open it again it is not centered but moved down and right from the previous position. And if I move the main window to a second monitor the popup still opens on the default monitor. Are these properties wrong or am I just thinking it should work in a different way. I suppose I could calculate the Top and Left properties manually. I just want the popup to be centered in the main window no matter where it is.

like image 365
nportelli Avatar asked Aug 10 '10 19:08

nportelli


3 Answers

Probably because you didn't set the owner:

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

That's how I do it and it centers the window perfectly all the time.

To extend on what Will Eddins commented, you could create an overload method for ShowDialog() or Show() in your Window:

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

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

Or overload a constructor:

public MyWindow(Window owner)
    : this()
{
    this.Owner = owner;
}
like image 190
Carlo Avatar answered Oct 24 '22 03:10

Carlo


If you create an extention for this, you could reuse this fine idea:

/// <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();
}
like image 7
Elken Avatar answered Oct 24 '22 02:10

Elken


In addition, we can use:

this.Owner = App.Current.MainWindow;

Or Application instead of App.
And place it in a child window constructor:

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

            DataContext = new ChildWindowViewModel();

            this.Owner = App.Current.MainWindow;
        }
    }
like image 3
1khtiyar Avatar answered Oct 24 '22 04:10

1khtiyar