【问题标题】:WPF WindowStartupLocation="CenterOwner" not really center, and pops all over, why?WPF WindowStartupLocation="CenterOwner" 不是真正的中心,并且到处弹出,为什么?
【发布时间】:2010-08-10 19:53:21
【问题描述】:

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

【问题讨论】:

    标签: wpf


    【解决方案1】:

    可能是因为你没有设置所有者:

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

    我就是这样做的,它始终使窗口完美居中。

    要扩展 Will Eddins 的评论,您可以在 Window 中为 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;
    }
    

    【讨论】:

    • 或者,在窗口上调用.Show().ShowDialog() 之前设置所有者:window.Owner = this;
    • Doh,你一定是在开玩笑吧。以前在winforms中这让我感到厌烦。该死的东西。您不能将您的所有者默认为曾经实例化您的人吗?
    • 哈哈,你可以创建一个带所有者的构造函数重载,我将在答案中添加一个示例。
    • @nportelli:在不传递对新窗口的引用的情况下,窗口如何知道是谁实例化了它?这将是一些巫术魔法!
    • 我在其他地方使用了 'System.Windows.Window.GetWindow(this)' 并且它有效,但在用户控制案例中它返回 null。然后调用“System.Windows.Application.Current.MainWindow”就可以了。
    【解决方案2】:

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

    /// <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】:

      另外,我们可以使用:

      this.Owner = App.Current.MainWindow;
      

      Application 而不是App
      并将其放在 child 窗口构造函数中:

          public partial class ChildWindow : Window
          {
              public ChildWindow()
              {
                  InitializeComponent();
      
                  DataContext = new ChildWindowViewModel();
      
                  this.Owner = App.Current.MainWindow;
              }
          }
      

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题...但这主要是因为当我想摆脱子窗口时,我使用了hide() 而不是close() ...所以当您重新打开它时,因为它是隐藏的,没有关闭,所以当父窗口移动时,它仍然在它的启动位置打开...

        所以当关闭子窗口而不是隐藏它时,例如在完成使用它时。

        【讨论】:

          【解决方案5】:

          在调用InitializeComponent() 之后设置DataContext 可能会导致这种情况。

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

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

          改成:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-12-11
            • 2016-05-01
            • 2012-04-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-10
            相关资源
            最近更新 更多