2009-08-06 6 views
2

ボタンのクリックからwInstance.ShowDialog()を呼び出すことによって表示されるウィンドウインスタンスがあり、Alt + F4を押してウィンドウを閉じます。今問題は、wInstance.ShowDialog()をもう一度呼び出すことができないことです。同じウィンドウインスタンスを再利用するにはどうすればいいですか?既に閉じられているWPFウィンドウインスタンスを再利用する方法はありますか?

例外: ウィンドウが閉じられた後で、可視性を設定したり、ShowまたはShowDialogを呼び出すことはできません。

+0

[WPF:閉じた後にウィンドウを再利用できません](http://stackoverflow.com/questions/3568233/wpf-cannot-reuse-window-after-it-has-been-closed) – nemesv

+0

これは、新しい投稿の重複することはできません...確かにその投稿は、この1つの複製ですか? – Sheridan

答えて

9

wInstance OnClosingメソッドをオーバーライドして、ウィンドウの表示を非表示に設定し、closeイベントをキャンセルする必要があります。

protected override void OnClosing(System.ComponentModel.CancelEventArgs e) 
    { 
     this.Visibility = Visibility.Hidden; 
     e.Cancel = true; 
    } 
+0

マーティンありがとう、これは先日自分自身に尋ねてきた質問に対する答えです。 – Dennis

+0

私はここで同じ問題を抱えていますが、このウィンドウを再び使用しようとすると例外が停止しましたが、ShowDialog()が期待したとおりにTrueを返すことを妨げています。これに関する提案はありますか? –

+0

ShowDialog()の戻り値は、ダイアログの処理方法を示します。この情報が重要な場合は、閉じたときに実際にウィンドウを破棄する必要があります。そのため、閉じるイベントをキャンセルしないで、新しいウィンドウをインスタンス化して再オープンする必要があります。ウィンドウの状態情報が重要な場合は、メモのパターンを考慮してください。 –

1

同じウィンドウを使用することが非常に重要になるのは正確です。 MVVMを使用している場合は、新しいウィンドウにviewmodelを再利用するだけで済みます。

+0

しかし、私は、新しいウィンドウインスタンスの作成のコストを排除したい。したがって、再利用可能範囲が存在するかどうかをチェックし、そのインスタンスに対してShowDialog()を再度使用します。 –

+0

あなたのウィンドウは高価ですか? – Botz3000

+0

マーティン・ドムズの答えは正しいですが、私は自分自身でこの質問について非常に不思議です。このビューを作成するオーバーヘッドを過大評価している可能性はありますか?特にMVVMを使用し、VMを保持している場合は特にそうですか? –

0

私は、ツリービューを使用し、クライアントが木の枝は、より選択のために開いたままにしたいダイアログなどのウィンドウを再利用しています。

オーバーライドは再利用のために機能し、ブランチは拡大したままです。

私は、読み込み専用の選択ダイアログであるため、ビューモデルを単純なままにしていません。しかし、まだ選択をクリアしていないので、ビューモデルに切り替える必要があるかもしれません。

関連する問題