tags:

views:

79

answers:

1

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.

+2  A: 

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;
}
Carlo
Alternatively, set the owner before you call `.Show()` or `.ShowDialog()` on the window: `window.Owner = this;`
Will Eddins
Doh, you have to be kidding me. That has bit me before in winforms. Damned thing. Can't you default your owner to whom ever instantiated you?
nportelli
Haha you could create a constructor overload that takes the owner, I will add an example in the answer.
Carlo
@nportelli: How would the Window know who instantiated it without passing a reference to the new Window? It'd be some voodoo magic!
rossisdead