私はWPFアプリケーションでこの非常に奇妙な動作に気付きました。サブウィンドウが3番目のウィンドウでShowDialogを使用した後、メインウィンドウが他のアプリケーションのウィンドウの後ろに消えます
私はMainWindow
です。Show()
をApp.OnStartup
としています。 MainWindow
は、Show()
も使用して、(非モーダル)SubWindow
を開くことができます。 SubWindow
のOwner
はMainWindow
に設定されます。
SubWindow
が閉じている場合は、MainWindow
が再び表示されます(正常)。
いくつかのアクションはSubWindow
がShowDialog()
(Owner
がSubWindow
に設定されている)を使用して、モーダルダイアログとして第三のウィンドウを開くことがあります。そのモーダルダイアログがSubWindow
の存続期間中に少なくとも1回開いて閉じられると、奇妙なことが起こります。
SubWindow
を閉じた後、MainWindow
は表示されません。代わりに、任意のウィンドウがの後にMainWindow
の後ろに表示されます。誰が私になぜこれが起こり、それを修正する方法を説明することができますか?
モーダルダイアログボックスがWindow
(ShowDialog()
)と表示されているのか、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();
}
};
}
それは我々が、私はおよそに取り組ん平野の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が示唆するような回避策を使用したことを思い出してください。 –
あなたのコードは無限ループを引き起こします。私は、 'base.OnClosing'はあなたが呼んでいるメソッドに実装されている仮想関数なので、それ自身を呼び出すと想像することができます。 – Steztric
もう一つ、 'Closing'イベントを処理しても問題は解決しません - 私は' Closed'イベントを処理する必要がありました。 – Steztric