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

Wpf

Wpf Problem Overview


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.

Wpf Solutions


Solution 1 - Wpf

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;
}

Solution 2 - Wpf

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

Solution 3 - Wpf

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;
        }
    }

Solution 4 - Wpf

I had the same problem...but it was mostly due to the fact that, when i wanted to get rid of the child window, I used hide() instead of close() ... so when you reopen it, because it was hidden and not closed, when the parent window is moved, it still opens at it's startup location...

So when close the child window instead of hiding it for example when finished working with it.

Solution 5 - Wpf

Something else that can cause this is setting DataContext after InitializeComponent() is called.

If you have code-behind like this:

    public CustomWindow(CustomViewModel viewModel)
    {
        InitializeComponent();
        DataContext = viewModel;
    }

Change it to:

    public CustomWindow(CustomViewModel viewModel)
    {
        DataContext = viewModel;
        InitializeComponent();
    }

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionnportelliView Question on Stackoverflow
Solution 1 - WpfCarloView Answer on Stackoverflow
Solution 2 - WpfElkenView Answer on Stackoverflow
Solution 3 - WpfXnytonView Answer on Stackoverflow
Solution 4 - WpfkenkenesView Answer on Stackoverflow
Solution 5 - WpfDanView Answer on Stackoverflow