开发者

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

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开发者_StackOverflow中文版 no matter where it is.


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


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


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


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.


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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜