そのため、 dockpanel-suiteでタグ付けされた既存の回答を調べましたが、探しているものが見つかりませんでした (これを入力すると、同様の質問領域にも表示されません)。 まず、ワークスペース全体の保存と復元について質問しているわけではないことに注意してください。
これがシナリオです。ユーザーの要求に応じて追加されるグラフィカル ウィンドウ (「タイムライン」と呼びます) があります。追加されると、メイン フォームの一番下の領域に自動的にドッキングされます。次に、タイムライン ウィンドウを別の場所に再ドッキングし (エッジにドッキングするか、別のドッキング ペイン内にドッキングすることができます)、ドッキング動作を変更します (フローティング、自動非表示、タブなど)。
実証可能な例は、Visual Studio にあります。右側のドッキングされたペイン内のタブにソリューション エクスプローラーがあり、ソリューション エクスプローラーを閉じる場合は、[表示] -> [ソリューション エクスプローラー] に移動して再度表示すると、正しい場所に復元されます。
ここで、ユーザーはタイムライン ウィンドウの[x]をクリックしてタイムライン ウィンドウを完全に閉じます。その後、ユーザーはそれをアプリケーションに再度追加するように要求します。最後に閉じたときの最後のドック状態と位置に戻したいです。
今、私はContentRemoved
イベントでペインのクローズをキャッチできるように見えますが、そこe.Content.DockHandler.Pane,
e.Content.DockHandler.PanelPane
にe.Content.DockHandler.FloatPane
はすべてがありnull
、以前のドックジオメトリを取得する明白な方法はありません. e.Content.DockHandler.DockPanel
有効ですが、それは親/ルートドッキングパネルであり、SaveAsXml(...)
ワークスペース全体を取得するため、呼び出しは何もしません。
ここで捕獲できたとしても、必要な情報です。しかし、私も単純に何かを呼び出すことはできないようLoadFromXml(...)
です。
DockContent
オブジェクトが に追加される前にそれを実行しようとするとDockPanel
、DockHandler.DockPanel
メンバーが null になるため、取得できたとしても、XML を復元する場所がないように見えます。
DockPanel
ここで私を助けることができるように見える他のイベントはありません。
だから - これを行う方法はありますか?それを行う正しい方法は何ですか? 閉じたときにドック情報をXMLとしてキャプチャして後で復元しようとして、間違ったツリーを吠えていないことを確認したいと思います。
ウィンドウを実際に閉じるのではなく、ドッキングを解除して非表示にするというアイデアをいじりましたが、まだそこまで探求していません。イベントをフックする場合と同じですが、ドッキング/フローティング/その他DockChanged
のオブジェクトでは発生しないようです。DockContent
理由はわかりません。
また、最後のドッキング親が存在しなくなった場合などのシナリオを正しく処理できるように、ソリューションは十分に堅牢である必要があります。たとえば、どこかにタブとしてドッキングされていたが、現在はその親ウィンドウ (タブを含む) も閉じられている場合。LoadFromXml,
まだテストできていないため、それが正しい方法であるかどうか、このシナリオを処理するのに十分な堅牢性があるかどうかはわかりません。