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 は、 modalである必要がある "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;
        }
    }
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

非常に遅い答え...私はちょうどこの同じ問題を抱えていて、Vivの回避策もそれを解決しました。答えの「理由」の部分については、子ウィンドウがその存続期間中に独自の子ウィンドウを生成するときに発生すると思います。私の経験では、子ウィンドウを開く必要があるフローにある [保存] ボタンを押すたびに発生しました。ただし、キャンセル(またはエスケープ)またはWindowsのデフォルトの終了ボタンを押しても、問題は発生しませんでした。

于 2016-03-14T11:05:42.927 に答える
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 に答える
0

同様の問題がありましたが、原因は非常に単純でした。Window のメソッド Close() が 2 回呼び出されました。2 番目の呼び出しを削除した後、すべて正常に戻りました。

于 2014-10-16T09:33:37.177 に答える
0

まず、あなたのコードがそのままの状態で、この奇妙な動作を確認できます。ここで気になったことが2つあります。1 つ目は、 が設定されて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 に答える