Visual Studioのメインウィンドウの上下左右には、ツールボックス、ソリューションエクスプローラ、プロパティウィンドウなどがくっついており、これらはドラッグすることにより、分離させてウィンドウにしたり、別の位置にドッキングさせたり、サイズを変えたりすることが出来るようになっています。このようなウィンドウをDocking Windowと呼びます。ここでは、.NETでDocking Windowを可能にするライブラリを紹介します。なお、ここでは無料で使用できるものしか紹介しません。
もし、ここで紹介されてないけれど、優れたライブラリがあるという場合は、ぜひご連絡ください。よろしくお願いいたします。
現在最も一般的なライブラリは、DockPanel Suiteであるようです。現在のバージョンは2.9.0で、ライセンスはMITです。
Docking Windowとしての機能は一通りそろえており、「自動的に隠す」機能(右上のピンのマークをクリックすることにより、Windowが自動的に隠れ、マウスを持っていくことにより、再び表示できる機能)や、タブとしてドッキングさせる機能、Docking Windowの状態を保存、復元する機能などがあります。
DockPanel Suiteでは、Docking WindowとなるDockContentクラスがSystem.Windows.Forms.Formクラスを継承しているため、Docking Windowのデザインをフォームデザイナで行えます。
DockPanel Suiteをちょっと使ってみましょう。まず、「ツールボックス」を開き、適当な個所を右クリックしてコンテキストメニューを表示し、「アイテムの選択」を選択します。「ツールボックスアイテムの選択」ダイアログで「参照」ボタンを押して、「WeifenLuo.WinFormsUI.Docking.dll」を選択します。「OK」ボタンを押して「ツールボックスアイテムの選択」ダイアログを閉じると、ツールボックスに「DockPanel」が追加されます。
このDockPanelをフォームに貼り付け、DockプロパティをFillにしておきます(しなくても結構です)。このDockPanelの部分にDocking Windowがドッキングされます。
次にDocking Windowを作成します。まず、メニューの「プロジェクト」-「新しい項目の追加」を選択して「新しい項目の追加」ダイアログを表示します。ここで「継承されたフォーム」を選択し、「追加」をクリックします。「継承ピッカー」の「参照」をクリックし、「WeifenLuo.WinFormsUI.dll」を選択します。「継承元コンポーネントの指定」で「DockContent」を選択し、「OK」ボタンを押します。これで作成されるフォームがDocking Windowとなりますので、フォームデザイナで適当にデザインしましょう。
作成したDocking Windowを表示させるには、Showメソッドを使用します。次の例では、DockPanelである「dockPanel1」に、Docking Windowである「Form2」を左端にドッキングされた状態で表示させています。このコードは、dockPanel1のあるフォームに記述されているものとします。
'dockPanel1のあるフォームをMDIコンテナとする Me.IsMdiContainer = True 'IsMdiContainerをTrueにしない場合は、DocumentStyleをDockingWindowにする dockPanel1.DocumentStyle = _ WeifenLuo.WinFormsUI.Docking.DocumentStyle.DockingWindow 'Docking Windowを作成する Dim f2 As New Form2() 'dockManager1の左端にドッキングさせて表示する f2.Show(dockPanel1, WeifenLuo.WinFormsUI.Docking.DockState.DockLeft)
//dockPanel1のあるフォームをMDIコンテナとする this.IsMdiContainer = true; //IsMdiContainerをTrueにしない場合は、DocumentStyleをDockingWindowにする //dockPanel1.DocumentStyle = // WeifenLuo.WinFormsUI.Docking.DocumentStyle.DockingWindow; //Docking Windowを作成する Form2 f2 = new Form2(); //dockManager1の左端にドッキングさせて表示する f2.Show(dockPanel1, WeifenLuo.WinFormsUI.Docking.DockState.DockLeft);
上記「DockPanel Suite」の基になったのが、「DockManager Control」です。
以前最も一般的だったライブラリが、「Magic Library」にある「Magic Docking」です。
使い方も簡単です。「MagicLibrary.DLL」をプロジェクトの「参照設定」に追加し、次のようなコードをフォームのLoadイベントハンドラ(またはコンストラクタ)に書くだけで、Docking Windowができてしまいます。
'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
//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"]); }
現在は、残念ながらMagic Libraryは有料化され、「DotNetMagic」となりました。バージョン1.7.4までのMagic Libraryは今まで通り無料で使用できるようです。
バージョン1.7.4は現在単独ではダウンロードすることができないようです。バージョン1.7.4の「MagicLibrary.DLL」は、後述する「DockingManagerExtender」の「executables framework 1.1」に含まれているようです(コメントにてご報告をいただきました)。また、SharpDevelopにも含まれているようです。
「The Code Project - Magic Docking」からは、バージョン1.7.0がダウンロードできるようです。
このようにMagic Dockingの使用は決して難しいものではありませんが、Visual Studioのフォームデザイナを使って設定できるようになればもっと便利になるかもしれません。それを可能にするのが、「DockingManagerExtender」です。これを使えば、コードを自分で一行も書く必要がなくなります。
使い方は、「MagicLibrary.DLL」が「参照設定」に追加された状態で、「ツールボックス」の「コンポーネント」に「DockingManagerExtender.DLL」を追加し、これをフォームに貼り付けるだけです。フォームに貼り付けたDockingManagerExtenderのContainerControlプロパティを適当に設定し(通常は貼り付けたフォームとなるでしょう)、Docking Windowとするコントロールの「DockingManagerExtenderのADockingEnable」プロパティをTrueとすれば、Docking Windowが出来上がります。
SDockは、CodePlexで公開されているオープンソース(CPL)のライブラリです。現在のバージョンは 1.0.0.1 Alphaで、まだアルファ版ですが、残念ながら8年以上更新されていません。
SDockでは、ドッキングウィンドウの配置をVisual Studioのデザイナだけで行うことができます。以下にその簡単な手順を示します。
なおVisual Studioのドッキングウィンドウを例に取れば、SDockBayのMainPaneがコードやフォームデザイナなどが表示される真ん中の部分で、追加したPaneが「ソリューションエクスプローラ」や「プロパティウィンドウ」の部分(タブになっていない時)に当たると考えてよいでしょう。
私が少し試したところでは、不安定な部分が多く、実用には厳しいかもしれません。
上記で「不安定な部分」と表現した事柄に関して、開発者であるyukichikaさんにお知らせしたところ、対処法を含むご回答をいただきましたので、以下に紹介させていただきます。このやり取りは、バージョン 1.0.0.0 Alpha 時のものです。回答の部分は、yukichikaさんからいただいたご回答をほぼそのまま掲載させていただきました。
質問1
質問1に対する回答
質問2
質問2に対する回答
(この記事は「.NETプログラミング研究 第27号」で紹介したものです。)
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。