代码之家  ›  专栏  ›  技术社区  ›  nportelli

WPF WindowStartupLocation=“CenterOwner”不是真正的中心,而且到处都是弹出窗口,为什么?

wpf
  •  46
  • nportelli  · 技术社区  · 14 年前

    this 问题和 this 问题是相似的,但没有有效的答案。事实上,我希望WindowStartupLocation=CenterOwner可以工作……但事实并非如此。它似乎将新窗口置于网格列的中心,而不是主窗口的中心。所以我假设它认为那是父母。第二,当我关闭对话框并再次打开它时,它不是居中的,而是从上一个位置向下和向右移动。如果我把主窗口移到第二个监视器上,弹出窗口仍然会在默认监视器上打开。这些属性是错误的还是我只是认为它应该以一种不同的方式工作。我想我可以手动计算顶部和左侧的属性。我只想弹出窗口是在主窗口的中心,无论它在哪里。

    3 回复  |  直到 7 年前
        1
  •  89
  •   Carlo    14 年前

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

    我就是这样做的,它一直完美地将窗户居中。

    要扩展Eddins的评论内容,可以在窗口中为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
  •  7
  •   Elken    12 年前

    如果你为此创建一个扩展,你可以重用这个好主意:

    /// <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
  •  2
  •   Xnyton    4 年前

    此外,我们可以使用:

    this.Owner = App.Current.MainWindow;
    

    或者 Application 而不是 App .
    把它放在 小孩

        public partial class ChildWindow : Window
        {
            public ChildWindow()
            {
                InitializeComponent();
    
                DataContext = new ChildWindowViewModel();
    
                this.Owner = App.Current.MainWindow;
            }
        }
    
        4
  •  1
  •   lin    10 年前

    我也有同样的问题…但主要是因为,当我想摆脱儿童窗口,我用 hide() close() ... 所以当你重新打开它时,因为它是隐藏的而不是关闭的,当父窗口被移动时,它仍然会在它的启动位置打开。。。

        5
  •  0
  •   Dan    5 年前

    另一个可能导致这种情况的因素是设置 DataContext 之后 InitializeComponent() 被称为。

    如果您有这样的代码隐藏:

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

    更改为:

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