14

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

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

5 回答 5

13

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

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

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

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关闭时最小化。

于 2013-10-03T11:16:47.723 回答
5

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

class SomeDialog : Window
{
    protected override void OnMouseDoubleClick(MouseButtonEventArgs e)
    {
        base.OnMouseDoubleClick(e);
        new CustomMessageBox().ShowDialog();
        Owner.Activate();
        Activate();
    }
}
于 2013-10-03T11:48:30.007 回答
5

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

于 2016-03-14T11:05:42.927 回答
0

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

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

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

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

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

于 2013-10-03T10:49:51.110 回答
0

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

于 2014-10-16T09:33:37.177 回答