2012-11-03 7 views
11

私はWPFアプリケーションでこの非常に奇妙な動作に気付きました。サブウィンドウが3番目のウィンドウでShowDialogを使用した後、メインウィンドウが他のアプリケーションのウィンドウの後ろに消えます

私はMainWindowです。Show()App.OnStartupとしています。 MainWindowは、Show()も使用して、(非モーダル)SubWindowを開くことができます。 SubWindowOwnerMainWindowに設定されます。

SubWindowが閉じている場合は、MainWindowが再び表示されます(正常)。

いくつかのアクションはSubWindowShowDialog()OwnerSubWindowに設定されている)を使用して、モーダルダイアログとして第三のウィンドウを開くことがあります。そのモーダルダイアログがSubWindowの存続期間中に少なくとも1回開いて閉じられると、奇妙なことが起こります。

SubWindowを閉じた後、MainWindowは表示されません。代わりに、任意のウィンドウがの後にMainWindowの後ろに表示されます。誰が私になぜこれが起こり、それを修正する方法を説明することができますか?

モーダルダイアログボックスがWindowShowDialog())と表示されているのか、MessageBox.Show()MessageBox.Show())と表示されているのかは違いありません。ここで


はこれを再現するために、いくつかの最小限コードです。ビジュアルスタジオで新しいWPFアプリケーションを作成し、これを事前生成されたMainWindow.xaml.csに貼り付けます。

次に、キーボードのキーを押して1つのウィンドウのみを開き、閉じます。 2つのキーを押して両方を閉じると、最初のウィンドウがVisual Studioの後ろにあります(恐らく)。

public MainWindow() 
{ 
    InitializeComponent(); 
    this.PreviewKeyDown += (sender, e) => 
    { 
     if (this.Owner is MainWindow) 
     { 
      // we're the SubWindow 

      MessageBox.Show("I am a modal dialog"); 

      // code below produces the exact same behavior as the message box 

      //var dialog = new MainWindow(); 
      //dialog.Owner = this; 
      //dialog.ShowDialog(); 
     } 
     else 
     { 
      // we're the initial MainWindow created by App. 
      var subWindow = new MainWindow(); 
      subWindow.Owner = this; 
      subWindow.Show(); 
     } 
    }; 
} 

答えて

9

これは私がそれを引き起こしたコードの欠陥を見つけることはなかったが、「お奨めのフィギュア、このうち」中心を扱うソースコード内のコメントのheckofalotがあります、かなり迷惑なWPFのバグです。理想的ではない回避策では、ウィンドウが閉じているときに、所有者に明示的にフォーカスを当てることで解決できます。 SubWindowクラスにこのコードをコピー/ペーストします。

protected override void OnClosing(System.ComponentModel.CancelEventArgs e) { 
     base.OnClosing(e); 
     if (!e.Cancel && this.Owner != null) this.Owner.Focus(); 
    } 
+1

それは我々が、私はおよそに取り組ん平野のWinForms(.NET 2)アプリケーションでこのバグを見て価値がある何のため5年前。私は今日、新しいプロジェクト(.NET 4.5)でもう一度それを実行しました。 'Show()'が2つ以上深くネストされていると、バグのヒンジが覚えているようです。他の人がそれに遭遇したように見える([ここ](http://www.pcreview.co.uk/forums/vbulletin-2005-windows-app-goes-back-z-order-after-dialog-box- clo-t3140486.html)と[ここ](http://web1.codeproject.com/Messages/1813163/Application-Goes-to-Back-of-ZOrder-after-cloasing-.aspx)); @Hansが示唆するような回避策を使用したことを思い出してください。 –

+0

あなたのコードは無限ループを引き起こします。私は、 'base.OnClosing'はあなたが呼んでいるメソッドに実装されている仮想関数なので、それ自身を呼び出すと想像することができます。 – Steztric

+0

もう一つ、 'Closing'イベントを処理しても問題は解決しません - 私は' Closed'イベントを処理する必要がありました。 – Steztric

0

ウィンドウを非表示にしても同じ問題が発生します。私はこのような状況で閉会と同等のイベントがあることを確認することはできませんが、とにかくこれは動作します:

 if (Owner != null) Owner.Focus(); 
     Hide(); 
関連する問題