0

でタグ付けされた既存の回答を調べましたが、探しているものが見つかりませんでした (これを入力すると、同様の質問領域にも表示されません)。 まず、ワークスペース全体の保存と復元について質問しているわけではないことに注意してください。

これがシナリオです。ユーザーの要求に応じて追加されるグラフィカル ウィンドウ (「タイムライン」と呼びます) があります。追加されると、メイン フォームの一番下の領域に自動的にドッキングされます。次に、タイムライン ウィンドウを別の場所に再ドッキングし (エッジにドッキングするか、別のドッキング ペイン内にドッキングすることができます)、ドッキング動作を変更します (フローティング、自動非表示、タブなど)。

実証可能な例は、Visual Studio にあります。右側のドッキングされたペイン内のタブにソリューション エクスプローラーがあり、ソリューション エクスプローラーを閉じる場合は、[表示] -> [ソリューション エクスプローラー] に移動して再度表示すると、正しい場所に復元されます。

ここで、ユーザーはタイムライン ウィンドウの[x]をクリックしてタイムライン ウィンドウを完全に閉じます。その後、ユーザーはそれをアプリケーションに再度追加するように要求します。最後に閉じたときの最後のドック状態と位置に戻したいです。

今、私はContentRemovedイベントでペインのクローズをキャッチできるように見えますが、そこe.Content.DockHandler.Pane, e.Content.DockHandler.PanelPanee.Content.DockHandler.FloatPaneはすべてがありnull、以前のドックジオメトリを取得する明白な方法はありません. e.Content.DockHandler.DockPanel有効ですが、それは親/ルートドッキングパネルであり、SaveAsXml(...)ワークスペース全体を取得するため、呼び出しは何もしません。

ここで捕獲できたとしても、必要な情報です。しかし、私も単純に何かを呼び出すことはできないようLoadFromXml(...)です。

DockContentオブジェクトが に追加される前にそれを実行しようとするとDockPanelDockHandler.DockPanelメンバーが null になるため、取得できたとしても、XML を復元する場所がないように見えます。

DockPanelここで私を助けることができるように見える他のイベントはありません。

だから - これを行う方法はありますか?それを行う正しい方法は何ですか? 閉じたときにドック情報をXMLとしてキャプチャして後で復元しようとして、間違ったツリーを吠えていないことを確認したいと思います。

ウィンドウを実際に閉じるのではなく、ドッキングを解除して非表示にするというアイデアをいじりましたが、まだそこまで探求していません。イベントをフックする場合と同じですが、ドッキング/フローティング/その他DockChangedのオブジェクトでは発生しないようです。DockContent理由はわかりません。

また、最後のドッキング親が存在しなくなった場合などのシナリオを正しく処理できるように、ソリューションは十分に堅牢である必要があります。たとえば、どこかにタブとしてドッキングされていたが、現在はその親ウィンドウ (タブを含む) も閉じられている場合。LoadFromXml,まだテストできていないため、それが正しい方法であるかどうか、このシナリオを処理するのに十分な堅牢性があるかどうかはわかりません。

4

1 に答える 1

0

質問を理解したら、Closing または FormClosing イベントをトラップし、フォームを .Hide() して e.Cancel = true に設定します。DockContent を使用している場合は、その作業を行う HideOnClose() があります。次に、ウィンドウを「再度開く」場合は、空の .Show() を使用するだけで、「閉じた」ときの場所が表示されます。最後のドッキング親が存在しなくなった場合の保存に関しては、ハックが必要になる Lex Li に同意します。

于 2015-11-04T22:30:27.507 に答える