xamDockManager™ コントロールは、エンド ユーザーがドック可能なペインのドラッグを開始すると常にドッキング インジケータを表示します。ドッキング インジケータのデフォルト スタイルは、Microsoft® Visual Studio® 2008 にあるようなドッキング インジケータのルック アンドフィールを複製します。ただし、ドッキング インジケーターを再スタイルするためにユーザー自身のコントロール テンプレートを作成することもできます。
自分自身でコントロール テンプレートを作成して、以下のスクリーンショットに似た xamDockManager のデフォルトのドッキング インジケーターを再スタイルします。
Window のローカル リソース ディクショナリのタグを追加します。
XAML の場合:
...
<Window.Resources>
<!--TODO: ここにデータ テンプレートを追加します-->
</Window.Resources>
...
Window のリソース ディクショナリで DockingIndicator コントロールをターゲットとするコントロール テンプレートを作成します。
DockingIndicator コントロールは、各サイドにひとつと中央に 1 つの合計 5 つの個別のドッキング インジケーターを持ちます。コントロール テンプレートを作成して、それを DockingIndicator コントロールの Template プロパティに指定すると、すべての 5 つのドッキング インジケーターは同じコントロール テンプレートを使用します。ただし、中央のドッキング インジケーターは動作しません。サイドのドッキング インジケーターよりもコントロール テンプレートでより視覚的な要素を必要とするからです。手順 5 は、中央のドッキング インジケーター用の個別のコントロール テンプレートを作成する手助けとなります。
XAML の場合:
...
<ControlTemplate x:Key="dockingIndicators" TargetType="{x:Type igDock:DockingIndicator}">
<Grid Width="36" Height="36">
<!--このパス オブジェクトはデフォルトで左をポイントします-->
<Path
Name="DockingIndicatorGlyph"
Fill="LightBlue"
Stretch="Uniform"
Stroke="Black"
Data="M277,116 L227,133 277,148 z" />
</Grid>
<ControlTemplate.Triggers>
<!--TODO: ここで Triggers を追加して Path オブジェクトを回転します-->
</ControlTemplate.Triggers>
</ControlTemplate>
...
Triggers を追加して DockingIndicator コントロールの Position プロパティに基づき Path オブジェクトを修正します。
DockingIndicator コントロールはエッジに沿ってすべてのドッキング インジケーターにコントロール テンプレートを使用するので、コントロール テンプレートの視覚的な要素を修正するには Triggers を追加する必要があります。たとえば、この例ではドッキング インジケーターは左をポイントする矢印です。ドッキング インジケーターが DockingIndicator コントロールの右側にある場合、右をポイントするために矢印を回転します。
XAML の場合:
...
<!--右をポイントするように Path オブジェクトの回転を起動します-->
<Trigger Property="Position" Value="Right">
<Setter TargetName="DockingIndicatorGlyph" Property="LayoutTransform">
<Setter.Value>
<RotateTransform Angle="180" />
</Setter.Value>
</Setter>
</Trigger>
<!--上をポイントするように Path オブジェクトの回転を起動します-->
<Trigger Property="Position" Value="Top">
<Setter TargetName="DockingIndicatorGlyph" Property="LayoutTransform">
<Setter.Value>
<RotateTransform Angle="90" />
</Setter.Value>
</Setter>
</Trigger>
<!--下をポイントするように Path オブジェクトの回転を起動します-->
<Trigger Property="Position" Value="Bottom">
<Setter TargetName="DockingIndicatorGlyph" Property="LayoutTransform">
<Setter.Value>
<RotateTransform Angle="-90" />
</Setter.Value>
</Setter>
</Trigger>
...
Triggers を追加して DockingIndicator コントロールの HotTrackPosition プロパティに基づき Path オブジェクトを修正します。
エンド ユーザーのアクションに基づき視覚的なフィードバックを与えるためのホットトラッキングを実装できますが、ドッキング インジケーターを動作させるために、これを実装する必要はありません。
XAML の場合:
...
<Trigger Property="HotTrackPosition" Value="Left">
<Setter TargetName="DockingIndicatorGlyph" Property="Fill" Value="Blue" />
</Trigger>
<Trigger Property="HotTrackPosition" Value="Right">
<Setter TargetName="DockingIndicatorGlyph" Property="Fill" Value="Blue" />
</Trigger>
<Trigger Property="HotTrackPosition" Value="Top">
<Setter TargetName="DockingIndicatorGlyph" Property="Fill" Value="Blue" />
</Trigger>
<Trigger Property="HotTrackPosition" Value="Bottom">
<Setter TargetName="DockingIndicatorGlyph" Property="Fill" Value="Blue" />
</Trigger>
...
Window のリソース ディクショナリで DockingIndicator コントロールをターゲットとする第 2 のコントロール テンプレートを作成します。
DockingIndicator コントロールの中央のドッキング インジケーターは、エンド ユーザーが xamDockManager の端にペインをドックできる、または別のペイン(タブ グループ)内のペインをドックできるドッキング インジケーターの組み合わせです。これらのドッキング場所のそれぞれを表すためには、5 つの視覚的要素が必要です。
XAML の場合:
...
<ControlTemplate x:Key="centerDockingIndicator" TargetType="{x:Type igDock:DockingIndicator}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30" />
<RowDefinition Height="30" />
<RowDefinition Height="30" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="30" />
<ColumnDefinition Width="30" />
<ColumnDefinition Width="30" />
</Grid.ColumnDefinitions>
<!--
この楕円形はドッキング インジケーターの中央で、グリッドの中央の四角の中に移動します。
この視覚的要素は、別のペイン(タブ グループ)内にペインをドックし、"PART_DockCenter" と名前を付ける必要があります。
-->
<Ellipse
Name="PART_DockCenter"
Stroke="Black"
Grid.Row="1"
Grid.Column="1"
Fill="Green" />
<!--
このパス オブジェクトは、左をポイントし、グリッドの 1 列、2 行目に移動する三角形です。
これは受け入れ、ペインを左にドックするので、"PART_DockLeft" と名前を付ける必要があります。
-->
<Path
Name="PART_DockLeft"
Grid.Row="1"
Grid.Column="0"
Fill="LightBlue"
Stretch="Uniform"
Stroke="Black"
Data="M277,116 L227,133 277,148 z"/>
<!--
このパス オブジェクトは、右をポイントし、グリッドの 3 列、2 行目に移動する三角形です。
これは受け入れ、ペインを右にドックするので、"PART_DockRight" と名前を付ける必要があります。
-->
<Path
Name="PART_DockRight"
Grid.Row="1"
Grid.Column="2"
Fill="LightBlue"
Stretch="Uniform"
Stroke="Black"
Data="M277,116 L227,133 277,148 z">
<Path.LayoutTransform>
<RotateTransform Angle="180" />
</Path.LayoutTransform>
</Path>
<!--
このパス オブジェクトは、上をポイントし、グリッドの 2 列、1 行目に移動する三角形です。
これは受け入れ、ペインを上にドックするので、"PART_DockTop" と名前を付ける必要があります。
-->
<Path
Name="PART_DockTop"
Grid.Row="0"
Grid.Column="1"
Fill="LightBlue"
Stretch="Uniform"
Stroke="Black"
Data="M277,116 L227,133 277,148 z">
<Path.LayoutTransform>
<RotateTransform Angle="90" />
</Path.LayoutTransform>
</Path>
<!--
このパス オブジェクトは、下をポイントし、グリッドの 2 列、3 行目に移動する三角形です。
これは受け入れ、ペインを下にドックするので、"PART_DockBottom" と名前を付ける必要があります。
-->
<Path
Name="PART_DockBottom"
Grid.Row="2"
Grid.Column="1"
Fill="LightBlue"
Stretch="Uniform"
Stroke="Black"
Data="M277,116 L227,133 277,148 z">
<Path.LayoutTransform>
<RotateTransform Angle="-90" />
</Path.LayoutTransform>
</Path>
</Grid>
<!--
手順 4 の XAML に似た XAML を使用してホットトラッキング機能を実装するために Triggers をコントロール テンプレートに追加できます。
setter の TargetName プロパティを、このコントロール テンプレートの視覚的要素にひとつに変更するだけです。
-->
</ControlTemplate>
...
以下の xamDockManager の XAML をユーザーの Window に追加します。
XAML は、3 つの空のコンテンツ ペインと DocumentContentHost オブジェクトと共にユーザーの Window に xamDockManager コントロールを追加します。
XAML の場合:
...
<igDock:XamDockManager Name="xamDockManager1">
<igDock:XamDockManager.Panes>
<igDock:SplitPane>
<igDock:ContentPane Header="pane 1" />
<igDock:ContentPane Header="pane 2" />
<igDock:ContentPane Header="pane 3" />
</igDock:SplitPane>
</igDock:XamDockManager.Panes>
<igDock:DocumentContentHost />
</igDock:XamDockManager>
...
xamDockManager のローカル リソース ディクショナリのタグを追加します。
XAML の場合:
...
<igDock:XamDockManager.Resources>
<!--TODO: ここに Styles を作成します-->
</igDock:XamDockManager.Resources>
...
xamDockManager のリソース ディクショナリで DockingIndicator コントロールをターゲットにするスタイルを作成します。
XAML の場合:
...
<Style TargetType="{x:Type igDock:DockingIndicator}">
</Style>
...
手順 2 で作成したコントロール テンプレートに Template プロパティを設定するスタイルに Setter オブジェクトを追加します。
この setter はすべてのドッキング インジケーターのテンプレートを指定します。DockingIndicator コントロールの Position プロパティに基づきテンプレートを変更する Triggers を追加できます。プロジェクトを実行してコンテンツ ペインをドラッグすると、以下のスクリーンショットのように表示されます。中央のドッキング インジケーターは、他のドッキング インジケーターと同じテンプレートを使用しています。それが機能しないことにも気づきます。中央のドッキング インジケーターが機能するようにするには、Position プロパティの値が Center である時は常にテンプレートを変更するスタイルに Trigger を追加する必要があります。
XAML の場合:
...
<Setter Property="Template" Value="{StaticResource dockingIndicators}" />
...
Position プロパティの値が Center である時に Template プロパティを変更するスタイルに Trigger オブジェクトを追加します。
前の手順で設定したテンプレートは、DockingIndicator コントロールの中央のドッキング インジケーターでは動作しません。DockingIndicator コントロールの中央でドッキング インジケーターが動作するためには、手順 5 で作成したテンプレートを使用する必要があります。
XAML の場合:
...
<Style.Triggers>
<Trigger Property="Position" Value="Center">
<Setter Property="Template" Value="{StaticResource centerDockingIndicator}" />
</Trigger>
</Style.Triggers>
...
プロジェクトを実行し、コンテンツ ペインをドラッグするとドッキング インジケーターが表示します。