ドッキング/フローティングの動作を一元管理する C1DockingManager コンポーネント

DockingTab for WinForms(以下、DockingTab)は、Visual Studio IDE などで採用されているドッキングウィンドウの機能を Windows フォームアプリケーションに提供するコントロールです。

主に、ドッキングタブの配置先コンテナとなる C1CommandDock、ドッキングタブの本体である C1DockingTab コントロール、および個々のタブページである C1DockingTabPage コントロールから構成されており、タブページのフロート表示、別のドッキングタブへのドッキング、スライドエフェクトによる自動非表示など、ドッキングウィンドウの特長的な機能を備えています。

基本的なドッキング/フローティング動作は DockingTab によって自動で制御されるので、ほとんどの場合、フォーム上にそれぞれのコントロールを配置するだけで、本格的なドッキングウィンドウシステムを簡単に構築できます。

ドッキング/フローティングの動作を制御する

特定のケースにおいて、ドッキング/フローティングの動作を独自に制御したい場合があります。それぞれのコントロールには、タブのドッキングおよびフローティング操作に関連する各種メンバーが提供されており、従来ではそれらを利用して制御する必要がありました。例えば、エンドユーザーによるフローティング操作を抑制するには、C1CommandDockAllowFloat プロパティを False に設定することになります。

ただ、このような方法だと、コントロールごとにプロパティの設定やイベントのハンドリングを行う必要があったり、ドッキング操作により動的に生成されたフローティングウィンドウの扱いを考慮しなければならないなど、少々扱いが難しいところがありました。

C1DockingManager コンポーネント

現在の DockingTab では、全体的なドッキング/フローティングの動作を一元管理するための C1DockingManager コンポーネントが用意されています。

ドッキング、フローティングなどの動作に対応する各種イベントが提供されており、そのイベント内でアクションのソースとなるコンポーネントおよびターゲットとなるコンポーネント、アクションに対する応答などを取得・設定することができます。動的に生成されたコンポーネントにも対応しており、従来に比べ制御にかかるコード量を大幅に削減することができます。

使用例

例えば、以下のレイアウトによるフォームがあるとします。左右のドッキングタブ(tabLefttabRight)はそれぞれ C1CommandDockdockLeftdockRight)上に配置されており、またドッキングタブ上にはいくつかのタブページ(tabPage1tabPage2tabPage3)が配置されています。

加えて C1DockingManager コンポーネントdockManager1)がフォームに配置されているとします。また、dockLeft および dockRightDockingStyle プロパティが「VS2012」に設定されており、tabLeft および tabRightVisualStyle プロパティが「Office2010Blue」に設定されているものとします。

DockingTab for WinForms の使用例

このフォームを例に、いくつかのケースにおける実装例を紹介いたします。

なお、それぞれのコードは、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 イベントを使用して、tabPage1tabLeft 上にドラッグされているときのみ、その内部へのドッキングを許可するドッキングアンカーを表示します。それ以外の場合はドッキングアンカーを表示しないようにすることで、ドッキング可能なタブを限定しています。

[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

tabLeft 上にドラッグした場合のみドッキングアンカーを表示

(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

動的に生成されたドッキングタブの VisualStyle を変更

今回紹介しましたイベントのほか、タブを閉じる動作の検出および抑制、タブページ等がドラッグ中かどうかの検出など、C1DockingManager コンポーネントを使用することで、ドッキング/フローティング動作をはじめとするさまざまななアクションの検出および制御を簡単に行うことができます。

\  この記事をシェアする  /