2013-10-03 34 views
9

次のコードは、子ウィンドウを閉じることで親ウィンドウが最小化される問題を示しています。子ウィンドウを閉じて親を最小化する

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によってsuggesrtedされた手法を使用するとかなり簡単です。

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; 
     } 
    } 
+0

ディレクトリを開くプロセスを開始する子ウィンドウでも同じ問題がありました(たとえば、 'Process.Start(" C:\\ ")')。受け入れられた答えが私のために働いた。 –

答えて

10

なぜそれが最小化され、どのように停止できますか?

これはバグとして報告することができ、非モーダルダイアログと同じように返事を見ることができます。

回避策としては、このようなものを試してみてください:この^^

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(); 
    } 
} 

SomeDialogが閉じているときに最小化することからMainWindow(親)を防止する必要があります。

+0

私のために働いた、ありがとう!コールバックを簡単にするための小さな変更があります(送信者が誰なのか分かっているので)。 'x.Closing + =(送信者、引数)=> {x.Owner = null; }; ' –

0

まず、コードが立っているので、私はこの奇妙な動作を確認できます。私がここに気づいたのは2つのことです。このコードを追加する

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

という問題が修正されています:

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

残念ながら、このdoesnの最初はSomeDialog.Ownerないセットである、またはそれは、このコードでnull値で終わりということということです子Windowが閉じられたときにMainWindowが最小化されないようにしてください。それから、私はそれが最小化されるのを止めることができることを発見しましたが、new SomeDialog().Show();の代わりにnew SomeDialog().ShowDialog();を呼び出すときだけです。しかし、これはWindowを私が信じた後のものではないダイアログにします。

3

この興味深い問題の回避策は、MainDisplayウィンドウを再度アクティブにするために、MainWindowを一度有効にすることです。

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

私たちも同様の問題がありましたが、原因はかなりシンプルでした。ウィンドウのClose()メソッドが2回呼び出されました。 2回目の呼び出しを取り除いた後、すべて正常に戻りました。

1

非常に遅い答え...私はちょうどこの同じ問題を抱えて座って、Vivの回避策は私のためにそれを解決しました。答えの「なぜ」の部分については、あなたの子ウィンドウが生涯にそれ自身の子ウィンドウを生成するときにが発生すると信じています。 私の経験上、子ウィンドウを開く必要があるフロー内にあるSaveボタンを押すたびに発生しました。しかし、キャンセル(またはエスケープ)またはWindowsのデフォルトの終了ボタンを押しても問題は発生しませんでした。

関連する問題