关闭子窗口可最大限度地减少父级

时间:2013-10-03 10:06:44

标签: wpf dialog window minimize

以下代码演示了我在关闭子窗口时最小化父窗口的问题,我不希望这种情况发生。

    class SomeDialog : Window
    {
        protected override void OnMouseDoubleClick(MouseButtonEventArgs e)
        {
            base.OnMouseDoubleClick(e);
            new CustomMessageBox().ShowDialog();
        } 
    }

    class CustomMessageBox : Window
    {
        public CustomMessageBox()
        {
            Owner = Application.Current.MainWindow;
        }
    }

    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        protected override void OnMouseDoubleClick(MouseButtonEventArgs e)
        {
            base.OnMouseDoubleClick(e);
            new SomeDialog() { Owner = this }.Show();
        }
    }

Window1是主要的应用程序窗口。

SomeDialog是一个窗口,在Window1中弹出一些事件(双击示例中的window1),需要无模式

CustomMessageBox是一个窗口,弹出“SomeDialog”中的某个事件(双击示例中的SomeDialog),需要模态

如果您运行该应用程序,然后双击Window1的内容以显示SomeDialog,然后双击SomeDialog的内容以显示CustomMessagebox。

现在关闭CustomMessagebox。细

现在如果你关闭SomeDialog,Window1最小化?为什么它会最小化,我该如何阻止它呢?

修改:使用Viv提出的技术,似乎解决方法相当简单。

class SomeDialog : Window
    {
        protected override void OnMouseDoubleClick(MouseButtonEventArgs e)
        {
            base.OnMouseDoubleClick(e);
            new CustomMessageBox().ShowDialog();
        }

        protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
        {
            base.OnClosing(e);
            Owner = null;
        }
    }

5 个答案:

答案 0 :(得分:11)

  

为什么它会最小化,我该如何阻止它呢?

不确定“为什么”也许您可以将其报告为错误并查看他们回复的内容,就像您不希望这种情况发生的非模态对话框一样。

至于解决方法,请尝试以下方法:

public partial class MainWindow : Window {
  ...

  protected override void OnMouseDoubleClick(MouseButtonEventArgs e) {
    base.OnMouseDoubleClick(e);
    var x = new SomeDialog { Owner = this };        
    x.Closing += (sender, args) => {
      var window = sender as Window;
      if (window != null)
        window.Owner = null;
    };
    x.Show();
  }
}

^^这可以防止MainWindow(父级)在SomeDialog关闭时最小化。

答案 1 :(得分:3)

我对这个有趣问题的解决方法是激活MainWindow一次,之后再次激活SomeDialog窗口。

class SomeDialog : Window
{
    protected override void OnMouseDoubleClick(MouseButtonEventArgs e)
    {
        base.OnMouseDoubleClick(e);
        new CustomMessageBox().ShowDialog();
        Owner.Activate();
        Activate();
    }
}

答案 2 :(得分:3)

一个非常晚的答案......我只是坐在同样的问题上,而Viv的解决方法也为我解决了这个问题。至于"为什么"作为答案的一部分,我相信当你的孩子的窗口在其生命周期中生成一个自己的子窗口时,它会发生 。 根据我的经验,只要按下我的保存按钮就会发生这种情况,该按钮位于需要打开子窗口的流程中。但是按下取消(或转义)或Windows默认退出按钮不会调用此问题。

答案 3 :(得分:0)

首先,正如你的代码所示,我可以证实这种奇怪的行为。我在这里注意到两件事。第一个是SomeDialog.Owner 设置,或者使用此代码以null值结束:

new SomeDialog() { Owner = this }.Show();

添加此代码可修复该问题:

public SomeDialog()
{
    Owner = Application.Current.MainWindow;
}

不幸的是,当孩子MainWindow关闭时,这并不会阻止Window被最小化。然后我发现我可以阻止它被最小化,但只有在调用new SomeDialog().ShowDialog();而不是new SomeDialog().Show();时才会这样做但是,这会使Window成为一个对话框,这不是你所追求的我相信。

答案 4 :(得分:0)

我们有类似的问题,但原因很简单。 Window的方法Close()被调用两次。在我们取消第二次通话后,所有人都恢复正常。