11

Expression Blendに見られるように、ドッキングツールボックスウィンドウシステムをどのように実装しますか。ツールボックスウィンドウは、タブまたはフローティングトップレベルウィンドウとして重なり合って、さまざまな方法で相互にドッキングできます。私のシステムは、ExpressionBlendとほとんど同じように動作するはずです。また、ドラッグしたときにツールボックスウィンドウがドッキングする視覚的な手がかりを得る方法は、まさに私が必要としているものです。

例外は1つだけです。ブレンドでは、すでにトップレベルになっている(切り離されている)ツールボックスウィンドウにドラッグすると、ウィンドウ全体を埋めるタブとしてのみドッキングできます。ただし、ツールボックスウィンドウとメインウィンドウに違いがないシステムが必要です。メインウィンドウと同じように、ツールボックスウィンドウでウィンドウを互いに下にドッキングできるようにする必要があります。

また、内部ポリシーにより、これにオープンソースまたはサードパーティのライブラリを使用することはできません。

このようなものの一般的なクラス設計をどのように設定するかに興味がありますか?さまざまなシナリオで使用できるように、できるだけ一般的なものにしたいと思います。

ドッキング動作は次の図のようになります。中央の画像は、意味のあるドラッグドッキング領域を示しています。そして、ウィンドウがスナップする外側の画像:

代替テキストhttp://img196.imageshack.us/img196/2450/dockingregions.png

一般的に、私はここで市長の問題に直面しています。プログラミングモデルを設計するにはどうすればよいですか(ドッキング構成をXAMLで永続化するにはどうすればよいですか)、基盤となる機能を実際に実装するにはどうすればよいですか。私が最初に考えたのは、DockPanelとTabControlの共生を実現したいということです。これの行の何か:

<DockTabControl>
  <DockTabItem Dock="FirstLeft">
    <DockTabItem.Header>
        <TextBlock>Tab 1</TextBlock>
    </DockTabItem.Header>
    <!-- Tab 1 content -->
  </DockTabItem>
  <DockTabItem Header="Tab 2" Dock="SecondLeft" DockMode="MergeWithPreviousToTabgroup">
    <!-- Tab 2 content -->
  </DockTabItem>
  <DockTabItem Header="Tab 3" Dock="FirstMiddle">
    <!-- Tab 3 content -->
  </DockTabItem>
</DockTabControl>

もちろん、これはまだ意味がありません。ドッキングをそのように定義することはできず、ウィンドウ処理の問題はここではまだ解決されていません。しかし、DockTabItemでいくつかのプロパティを定義するだけで、ドッキングとタブグループを定義するというアイデアが気に入っています。TabGroupsなどのような追加のコントロールを導入したくありません。子の順序とDockのアタッチされたプロパティを定義するだけで、DockPanelのドッキング動作が気に入っています。もちろん、私のドッキングはもう少し複雑になり、グリッドと同じように動作します。

4

4 に答える 4

19

質問で説明するシナリオをサポートするには、1つDockPanelで十分なので、作成する必要があるのは、OnDragEnter、OnDragOver、OnDragLeave、およびOnDragDropのハンドラーだけです。これらの4つのイベントの処理は非常に似ているため、私は通常、単一のイベントハンドラーを使用します。

OnDragEnter&OnDragOver:

  1. アイテムがドロップされるDockPanelのどのエッジと場所を計算します
  2. 既存の装飾者を削除します
  3. ドロップ位置を表示するために長方形の装飾を追加します

OnDragLeave:

  1. 既存の装飾者を削除します

OnDragDrop:

  1. 既存の装飾者を削除します
  2. アイテムがドロップされるDockPanelのどのエッジと場所を計算します
  3. ドラッグしたアイテムを現在のパネルから削除し、DockPanel.Dockを設定して、新しいパネルに追加します

もちろん、タイトルバーでのドラッグも処理し、ソースオブジェクトでDoDragDropを呼び出す必要があります。

ここでの2つの複雑さは次のとおりです。

  • DockPanelがニーズに十分であるかどうか、またはより複雑なデータ構造が必要かどうかを判断する
  • 幾何学的計算がウィンドウのすべての可能な構成を考慮に入れていることを確認してください

単純なアルゴリズムの場合、すべてのしわを取り除くのに1週間かかると推定します。非常に複雑なデータ構造が必要であり、構造自体が明白でない場合、その部分を理解するのにかなりの時間がかかる可能性があります。

于 2010-02-12T23:07:20.253 に答える
4

誰かがcodeproject.comに公開した素晴らしいWPFドッキングライブラリがあります。これはあなたが探している機能を備えています。私は一度myslefを使用しましたが、かなりスムーズに進みました。

ここでそれをチェックしてください:http://www.codeproject.com/KB/WPF/WPFdockinglib.aspx

于 2010-02-13T22:28:19.110 に答える
3

AvalonDockは良いです。

https://github.com/Dirkster99/AvalonDock

それはあなたがそれを使うことができないのは残念です;)

于 2011-02-22T14:58:00.050 に答える
-1

WPFには、ドッキング(またはその効果)をサポートするコントロールが既にあります。AdamNathanのWPF本WPFUnleashedを確認してください。彼は、パート2でそれをカバーしています。

于 2010-02-12T02:42:41.467 に答える