【问题标题】:Closing child window minimizes parent关闭子窗口最小化父窗口
【发布时间】:2013-10-09 23:38:30
【问题描述】:

以下代码演示了我遇到的一个问题,即关闭子窗口会最小化父窗口,这是我不希望发生的。

    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)中需要modal的事件时弹出的窗口。

如果您运行应用程序,然后双击 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;
        }
    }

【问题讨论】:

  • 我在子窗口启动一个打开目录的过程时遇到了同样的问题(例如Process.Start("C:\\"))。接受的答案对我有用。

标签: wpf dialog window minimize


【解决方案1】:

一个很晚的答案...我刚坐下来遇到同样的问题,Viv 的解决方法也为我解决了这个问题。至于答案的“为什么”部分,我相信它会发生当您的子窗口在其生命周期中产生自己的子窗口时。 根据我的经验,每当按下我的保存按钮时都会发生这种情况,该按钮处于需要打开子窗口的流程中。但是按取消(或转义)或 windows 默认退出按钮并没有引发问题。

【讨论】:

    【解决方案2】:

    我们遇到了类似的问题,但原因很简单。 Window 的方法 Close() 被调用了两次。在我们删除了第二个电话后,一切都恢复了正常。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        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(parent) 在SomeDialog 关闭时最小化。

        【讨论】:

        • 为我工作,谢谢!这里有一个小的修改来简化回调(因为你知道发件人是谁):x.Closing += (sender, args) => { x.Owner = null; };
        【解决方案5】:

        首先,就您的代码而言,我可以确认这种奇怪的行为。我在这里注意到两件事。第一个是SomeDialog.Owner 未设置,或者它以null 值结束,代码如下:

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

        添加此代码可解决该问题:

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

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

        【讨论】:

          猜你喜欢
          • 2020-06-26
          • 2012-12-15
          • 1970-01-01
          • 2013-02-14
          • 1970-01-01
          • 1970-01-01
          • 2020-10-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多