DockingTab for WinForms(以下、DockingTab)は、Visual Studio IDE などで採用されているドッキングウィンドウの機能を Windows フォームアプリケーションに提供するコントロールです。
主に、ドッキングタブの配置先コンテナとなる C1CommandDock、ドッキングタブの本体である C1DockingTab コントロール、および個々のタブページである C1DockingTabPage コントロールから構成されており、タブページのフロート表示、別のドッキングタブへのドッキング、スライドエフェクトによる自動非表示など、ドッキングウィンドウの特長的な機能を備えています。
基本的なドッキング/フローティング動作は DockingTab によって自動で制御されるので、ほとんどの場合、フォーム上にそれぞれのコントロールを配置するだけで、本格的なドッキングウィンドウシステムを簡単に構築できます。
ドッキング/フローティングの動作を制御する
特定のケースにおいて、ドッキング/フローティングの動作を独自に制御したい場合があります。それぞれのコントロールには、タブのドッキングおよびフローティング操作に関連する各種メンバーが提供されており、従来ではそれらを利用して制御する必要がありました。例えば、エンドユーザーによるフローティング操作を抑制するには、C1CommandDock の AllowFloat
プロパティを False に設定することになります。
ただ、このような方法だと、コントロールごとにプロパティの設定やイベントのハンドリングを行う必要があったり、ドッキング操作により動的に生成されたフローティングウィンドウの扱いを考慮しなければならないなど、少々扱いが難しいところがありました。
C1DockingManager コンポーネント
現在の DockingTab では、全体的なドッキング/フローティングの動作を一元管理するための C1DockingManager コンポーネントが用意されています。
ドッキング、フローティングなどの動作に対応する各種イベントが提供されており、そのイベント内でアクションのソースとなるコンポーネントおよびターゲットとなるコンポーネント、アクションに対する応答などを取得・設定することができます。動的に生成されたコンポーネントにも対応しており、従来に比べ制御にかかるコード量を大幅に削減することができます。
使用例
例えば、以下のレイアウトによるフォームがあるとします。左右のドッキングタブ(tabLeft、tabRight)はそれぞれ C1CommandDock(dockLeft、dockRight)上に配置されており、またドッキングタブ上にはいくつかのタブページ(tabPage1、tabPage2、tabPage3)が配置されています。
加えて C1DockingManager コンポーネント(dockManager1)がフォームに配置されているとします。また、dockLeft および dockRight の DockingStyle
プロパティが「VS2012」に設定されており、tabLeft および tabRight の VisualStyle
プロパティが「Office2010Blue」に設定されているものとします。
このフォームを例に、いくつかのケースにおける実装例を紹介いたします。
なお、それぞれのコードは、using ディレクティブ(C#)あるいは Imports ステートメント(Visual Basic .NET)にて名前空間による修飾なしに型 C1.Win.C1Command
が使用できるようになっていることを前提としております。また、C# コードについては、あらかじめ各イベントのハンドリングが行われているものとします。
(1) 特定のドッキングタブページをフローティングさせないようにする
特定のドッキングタブページがフローティング状態に移行するときに、Floating
イベントが発生します。e.DockingTabPage
イベント引数にてソースとなるタブページを取得でき、e.Cancel
イベント引数に True を設定することで、フローティング状態への移行をキャンセルるすることもできます。
以下の例は、Floating
イベントを使用して、tabPage1 がフローティング状態になるのを抑制します。
[C#]
private void docManager1_Floating(object sender, FloatingEventArgs e) { if (e.DockingTabPage == tabPage1) e.Cancel = true; }
[VB]
Private Sub dockManager1_Floating(sender As Object, e As FloatingEventArgs) Handles dockManager1.Floating If e.DockingTabPage Is tabPage1 Then e.Cancel = True End If End Sub
(2) 特定のドッキングタブ上にドラッグした場合にのみドッキングアンカーを表示する
ドッキングタブページのドッキング先を限定するには、QueryEnabledAnchors
イベントを使用して選択可能なドッキングアンカーを制御するのが簡単です。e.SourceDockingTabPage
イベント引数にてソースとなるドッキングタブページを、また e.DockingTabUnderCursor
イベント引数にてドラッグ中のマウスカーソルの位置にあるドッキングタブをチェックし、必要に応じて e.Anchors
イベント引数に対し有効なドッキングアンカーを設定します。
以下の例は、QueryEnabledAnchors
イベントを使用して、tabPage1 が tabLeft 上にドラッグされているときのみ、その内部へのドッキングを許可するドッキングアンカーを表示します。それ以外の場合はドッキングアンカーを表示しないようにすることで、ドッキング可能なタブを限定しています。
[C#]
private void docManager1_QueryEnabledAnchors(object sender, DockingAnchorsEventArgs e) { if (e.SourceDockingTabPage == tabPage1) if (e.DockingTabUnderCursor == tabLeft) e.Anchors = Anchors.DiamondAll; else e.Anchors = Anchors.None; }
[VB]
Private Sub dockManager1_QueryEnabledAnchors(sender As Object, e As DockingAnchorsEventArgs) Handles dockManager1.QueryEnabledAnchors If e.SourceDockingTabPage Is tabPage1 Then If e.DockingTabUnderCursor Is tabLeft Then e.Anchors = Anchors.DiamondAll Else e.Anchors = Anchors.None End If End If End Sub
(3) 動的なフローティングウィンドウが生成されたことを検出する
あるドッキングタブページがフローティング状態になると、フローティングウィンドウが動的に生成されます。またこのとき、FloatingWindowCreated
イベントが発生し、e.Form
イベント引数を参照することで生成されたフォームのインスタンスにアクセスできます。このインスタンスは通常、1つの C1DockingTab コントロールを子コントロールとして持っていますが、C1DockingTab がフローティング状態になった場合はそのオブジェクト自身、C1DockingTabPage がフローティング状態になった場合は動的に作成されたインスタンスとなります。
以下の例は、FloatingWindowCreated
イベントを使用して、C1DockingTabPage がフローティング状態になったときに、その VisualStyle
プロパティを Office2007Black に変更します。
[C#]
private void docManager1_FloatingWindowCreated(object sender, FloatingWindowCreatedEventArgs e) { if (e.Form != null && e.Form.Controls.Count > 0) { var tab = e.Form.Controls[0] as C1DockingTab; if(tab != null && !tab.Name.StartsWith("tab")) tab.VisualStyle = VisualStyle.Office2007Black; } }
[VB]
Private Sub dockManager1_FloatingWindowCreated(sender As Object, e As FloatingWindowCreatedEventArgs) Handles dockManager1.FloatingWindowCreated If Not e.Form Is Nothing AndAlso e.Form.Controls.Count > 0 Then Dim tab = CType(e.Form.Controls(0), C1DockingTab) If Not tab Is Nothing AndAlso Not tab.Name.StartsWith("tab") Then tab.VisualStyle = VisualStyle.Office2007Black End If End If End Sub
今回紹介しましたイベントのほか、タブを閉じる動作の検出および抑制、タブページ等がドラッグ中かどうかの検出など、C1DockingManager コンポーネントを使用することで、ドッキング/フローティング動作をはじめとするさまざまななアクションの検出および制御を簡単に行うことができます。