DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

.NETでDocking Windowを使う

Visual Studioのメインウィンドウの上下左右には、ツールボックス、ソリューションエクスプローラ、プロパティウィンドウなどがくっついており、これらはドラッグすることにより、分離させてウィンドウにしたり、別の位置にドッキングさせたり、サイズを変えたりすることが出来るようになっています。このようなウィンドウをDocking Windowと呼びます。ここでは、.NETでDocking Windowを可能にするライブラリを紹介します。(ここでは無料で使用できるものしか紹介しません。)

Magic Docking

何をおいてもまず初めに紹介しなければならないのが、Phil Wrightさんの「Magic Library」にある「Magic Docking」です。

このMagic Dockingは、オープンソースの.NET用IDEとして有名な「SharpDevelop」でも使用されていることからも、その信頼度の高さがうかがい知れます。

Magic Dockingはとにかく高機能です。Visual StudioのDocking Windowと見た目が似ているだけでなく、「自動的に隠す」機能(右上のピンのマークをクリックすることにより、Windowが自動的に隠れ、マウスを持っていくことにより、再び表示できる機能)や、タブとしてドッキングさせる機能、Docking Windowの状態をXMLファイルやバイト型配列に保存し、復元する機能など、申し分ありません。

使い方も簡単です。「MagicLibrary.DLL」を「参照設定」に追加し、次のようなコードをフォームのLoadイベントハンドラ(またはコンストラクタ)に書くだけで、Docking Windowができてしまいます。(たった4行!!)

VB.NET
コードを隠すコードを選択
'Imports Crownwood.Magic.Common
'Imports Crownwood.Magic.Docking
'がソースファイルの一番上に書かれているものとする

Private _dockingManager As DockingManager = Nothing

'フォームのLoadイベントハンドラ
Private Sub Form1_Load(ByVal sender As Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load
    'DockingManagerオブジェクトの作成
    _dockingManager = New DockingManager(Me, VisualStyle.IDE)
    'Contentとして新しく作成したRichTextBoxコントロールを追加
    _dockingManager.Contents.Add(New RichTextBox, "RichTextBox")
    'Contentを表示
    _dockingManager.ShowContent( _
        _dockingManager.Contents("RichTextBox"))
End Sub
C#
コードを隠すコードを選択
//using Crownwood.Magic.Common;
//using Crownwood.Magic.Docking;
//がソースファイルの一番上に書かれているものとする

private DockingManager _dockingManager = null;

//フォームのLoadイベントハンドラ
private void Form1_Load(object sender, System.EventArgs e)
{
    //DockingManagerオブジェクトの作成
    _dockingManager = new DockingManager(this, VisualStyle.IDE);
    //Contentとして新しく作成したRichTextBoxコントロールを追加
    _dockingManager.Contents.Add(new RichTextBox(), "RichTextBox");
    //Contentを表示
    _dockingManager.ShowContent(
        _dockingManager.Contents["RichTextBox"]);
}

DockingManagerExtender

このようにMagic Dockingの使用は決して難しいものではありませんが、Visual Studio .NETのフォームデザイナを使って設定できるようになればもっと便利になるかもしれません。それを可能にするのが、「DockingManagerExtender」です。これを使えば、コードを自分で一行も書く必要がなくなります。

使い方は、「MagicLibrary.DLL」が「参照設定」に追加された状態で、「ツールボックス」の「コンポーネント」に「DockingManagerExtender.DLL」を追加し、これをフォームに貼り付けるだけです。フォームに貼り付けたDockingManagerExtenderのContainerControlプロパティを適当に設定し(通常は貼り付けたフォームとなるでしょう)、Docking Windowとするコントロールの「DockingManagerExtenderのADockingEnable」プロパティをTrueとすれば、Docking Windowが出来上がります。

このようにMagic Dockingは、まさに最強といえますが、残念なことに、Magic Libraryは有料化され、「DotNetMagic」となりました。バージョン1.7.4までのMagic Libraryは今まで通り無料で使用できるようです。

バージョン1.7.4はこちらからダウンロードできるようです。また、「DockingManagerExtender」にも含まれているとのことです。(コメントにてご報告をいただきました。)MagicLibrary.DLLだけならば、SharpDevelopに含まれているので、今のところは簡単に入手できます。

上記「The Code Project - Magic Docking - VS.NET Style」からバージョン1.7.0がダウンロードできるようです。

DockPanel Suite

下記の「DockManager Control」がこの「DockPanel Suite」となったようです。(コメントにてご報告をいただきました。)

DockManager Control

Magic Dockingと同様の見た目と機能を持つライブラリに、「DockManager Control」があります。DockManager ControlはMDIフォームに対するドッキングを可能とすることを目的としているそうです。(最新バージョンは1.2.3。)

DockManager Controlでは、Docking WindowとなるContentクラスがSystem.Windows.Forms.Formクラスを継承しているため、Docking Windowのデザインをフォームデザイナで行えます。

DockManager Controlをちょっと使ってみましょう。まず、「ツールボックス」の「コンポーネント」に「WeifenLuo.WinFormsUI.dll」を追加します。「DockManager」をフォームに貼り付け、DockプロパティをFillにしておきます(しなくても結構です)。このDockManagerの部分にDocking Windowがドッキングされます。

次にDocking Windowを作成します。「新しい項目の追加ダイアログ」を表示し、「継承されたフォーム」を選択後、「開く」をクリックします。「継承ピッカー」の「参照」をクリックし、「WeifenLuo.WinFormsUI.dll」を選択後表示される「Content」を選択し、OKをクリックします。これで作成されるクラスがDocking Windowとなりますので、フォームデザイナで適当にデザインしましょう。

作成したDocking Windowを表示させるには、Showメソッドを使用します。次の例では、DockManagerオブジェクトdockManager1に、Docking WindowのForm2を左端にドッキングされた状態で表示させています。

VB.NET
コードを隠すコードを選択
'Docking WindowのForm2オブジェクトの作成
Dim f2 As New Form2
'dockManager1の左端にドッキングされて表示する
f2.Show(dockManager1, WeifenLuo.WinFormsUI.DockState.DockLeft)
C#
コードを隠すコードを選択
//Docking WindowのForm2オブジェクトの作成
Form2 f2 = new Form2();
//dockManager1の左端にドッキングされて表示する
f2.Show(dockManager1, WeifenLuo.WinFormsUI.DockState.DockLeft);

DockManager ControlはMagic Dockingと互角の機能をもっており、便利なコントロールですが、まだまだバグが多いようです。

SDock

SDockは、CodePlexで公開されているオープンソース(CPL)のライブラリです。現在(バージョン 1.0.0.0 Alpha)は公開されたばかりでまだアルファ版ですが、機能は「Magic Docking」にも引けを取りません。

SDockでは、ドッキングウィンドウの配置をVisual Studioのデザイナだけで行うことができます。以下にその簡単な手順を示します。

  1. Visual Studioの「ツールボックス」に「yukilib.dll」を追加する。
  2. フォームに「SDockBay」を配置する。
  3. 配置したSDockBayの内部をクリックしてMainPaneを選択し、Visual Studioのプロパティウィンドウから、「新規Paneを右にドッキング」を選択する。SDockPaneが右側に追加される。
  4. SDockPaneに好きなコントロールを配置する。プロパティウィンドウの「タブの追加」により、タブを追加することもできる。タブもドッキングウィンドウとして動作する。
  5. 3〜4を繰り返して、Paneやタブを必要なだけ追加する。
  6. 以上。

なおVisual Studioのドッキングウィンドウを例に取れば、SDockBayのMainPaneがコードやフォームデザイナなどが表示される真ん中の部分で、追加したPaneが「ソリューションエクスプローラ」や「プロパティウィンドウ」の部分(タブになっていない時)に当たると考えてよいでしょう。

私が少し試したところでは、現在はまだ不安定な部分が多く、実用には厳しいかもしれません。しかし、公開されたばかりで、しかも機能の豊富さを考慮すれば、完成度も高く、これからに期待できます。しかも開発されている方が日本人ですので、XMLドキュメントの説明が日本語で分かりやすく、また、フィードバックや要望などもしやすいという利点があります。

SDockに関する質問と回答

上記で「不安定な部分」と表現した事柄に関して、開発者であるyukichikaさんにお知らせしたところ、対処法を含むご回答をいただきましたので、以下にそれを紹介させていただきます。(回答の部分は、yukichikaさんからいただいたご回答をほぼそのまま掲載させていただきます。)

質問1
  • Visual StudioのフォームデザイナでPaneのサイズを変更すると、境界線が広かったようになります。
  • 次のような手順でアプリケーションを作成すると、おかしくなります。
    1. フォームにSDockBayを配置する。
    2. DockプロパティをFillにする。
    3. 「新規Paneを上にドッキング」を選択してPaneを追加する。
    4. ビルドして実行する。
    5. 実行したアプリケーションで、Paneを下にドッキングさせようとすると、おかしくなる。
  • SDockBayにPane等を配置後、SDockBayのDockを変更すると、Paneが消えます。
質問1に対する回答

【原因】

上記デザイン時プロパティが正しくシリアル化・逆シリアル化されていない。もしくは「Controlsプロパティで直接追加した」というフラグが正しく動作していない。そのため、OnLayout時の動作が正しく機能しない。

【応急処置方法】

SDockBayにPaneを追加した後、サイズ変更(Pane,Bayに関わらず)をデザイナ上で行う場合、

  • サイズ変更を行う前に、ビルドを実行する。
  • サイズ変更を行う前に、一度デザイナを閉じ、再度デザイナを開く。

ことにより、 サイズ変更(Dockプロパティでのサイズ変更も含まれます。) に伴うバグは発生しなくなると思います。

まことに申し訳有りませんが、現状ではユーザ負担の大きい対処法しかありません。 今後のアップデートできちんと対策致します。

質問2

SDockBayを削除しても、SDockBayに配置されたコントロールがなくなりません。

質問2に対する回答

【原因】

  • デザイナクラスではIComponentChangeServiceを利用してアンドゥリドゥ管理しています。この利用タイミングが誤っているため。
  • SDockBayのデザイナクラスのAssociatedComponentsプロパティを適切にoverrideしていないため。

【対策法】

こちらに関しては動作確認後、近日中にアップデートいたします。

それ以外のコントロール

Docking Windowを可能にするライブラリはまだまだあります。以下にずらずら並べて見ます。(ほとんどが私は実際に試していません。)

有料のものを含め、「Windows Forms : Control Gallery - Docking Windows」でもいくつか紹介されています。

なお、ここで紹介されていないものをご存知の方は、ぜひご連絡ください。よろしくお願いいたします。

  • 履歴:
  • 2007/1/10 「DockPanel Suite」を追加。
  • 2007/4/9 「SDock」を追加。
  • 2008/9/11 「Docking Control」をリンク切れのために削除。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。
  • 「???を参照に追加します」の意味が分からないという方は、こちらをご覧ください。