.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行!!) '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"]); } 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 ControlMagic 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を左端にドッキングされた状態で表示させています。 'Docking WindowのForm2オブジェクトの作成 Dim f2 As New Form2 'dockManager1の左端にドッキングされて表示する f2.Show(dockManager1, WeifenLuo.WinFormsUI.DockState.DockLeft) //Docking WindowのForm2オブジェクトの作成 Form2 f2 = new Form2(); //dockManager1の左端にドッキングされて表示する f2.Show(dockManager1, WeifenLuo.WinFormsUI.DockState.DockLeft); DockManager ControlはMagic Dockingと互角の機能をもっており、便利なコントロールですが、まだまだバグが多いようです。 SDockSDockは、CodePlexで公開されているオープンソース(CPL)のライブラリです。現在(バージョン 1.0.0.0 Alpha)は公開されたばかりでまだアルファ版ですが、機能は「Magic Docking」にも引けを取りません。 SDockでは、ドッキングウィンドウの配置をVisual Studioのデザイナだけで行うことができます。以下にその簡単な手順を示します。
なおVisual Studioのドッキングウィンドウを例に取れば、SDockBayのMainPaneがコードやフォームデザイナなどが表示される真ん中の部分で、追加したPaneが「ソリューションエクスプローラ」や「プロパティウィンドウ」の部分(タブになっていない時)に当たると考えてよいでしょう。 私が少し試したところでは、現在はまだ不安定な部分が多く、実用には厳しいかもしれません。しかし、公開されたばかりで、しかも機能の豊富さを考慮すれば、完成度も高く、これからに期待できます。しかも開発されている方が日本人ですので、XMLドキュメントの説明が日本語で分かりやすく、また、フィードバックや要望などもしやすいという利点があります。 SDockに関する質問と回答上記で「不安定な部分」と表現した事柄に関して、開発者であるyukichikaさんにお知らせしたところ、対処法を含むご回答をいただきましたので、以下にそれを紹介させていただきます。(回答の部分は、yukichikaさんからいただいたご回答をほぼそのまま掲載させていただきます。) 質問1
質問1に対する回答【原因】 上記デザイン時プロパティが正しくシリアル化・逆シリアル化されていない。もしくは「Controlsプロパティで直接追加した」というフラグが正しく動作していない。そのため、OnLayout時の動作が正しく機能しない。 【応急処置方法】 SDockBayにPaneを追加した後、サイズ変更(Pane,Bayに関わらず)をデザイナ上で行う場合、
ことにより、 サイズ変更(Dockプロパティでのサイズ変更も含まれます。) に伴うバグは発生しなくなると思います。 まことに申し訳有りませんが、現状ではユーザ負担の大きい対処法しかありません。 今後のアップデートできちんと対策致します。 質問2SDockBayを削除しても、SDockBayに配置されたコントロールがなくなりません。 質問2に対する回答【原因】
【対策法】 こちらに関しては動作確認後、近日中にアップデートいたします。 それ以外のコントロールDocking Windowを可能にするライブラリはまだまだあります。以下にずらずら並べて見ます。(ほとんどが私は実際に試していません。)
有料のものを含め、「Windows Forms : Control Gallery - Docking Windows」でもいくつか紹介されています。 なお、ここで紹介されていないものをご存知の方は、ぜひご連絡ください。よろしくお願いいたします。
(この記事は「.NETプログラミング研究 第27号」で紹介したものです。) 注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。 |
|
Copyright(C) DOBON!. All rights reserved.
|