Template settings (テンプレート設定) クラス

[前提条件]

UI にコントロールを追加し、そのプロパティを設定し、イベント ハンドラーをアタッチできることを前提としています。 アプリにコントロールを追加する手順については、「コントロールの 追加とイベントの処理」を参照してください。 また、既定のテンプレートのコピーを作成して編集することで、コントロールのカスタム テンプレートを定義する方法の基本を理解していることを前提としています。 詳細については、「 コントロール テンプレート」を参照してください。

TemplateSettings クラスのシナリオ

TemplateSettings クラスは、コントロールの新しいコントロール テンプレートを定義するときに使用される一連のプロパティを提供します。 プロパティには、特定の UI 要素パーツのサイズのピクセル測定などの値があります。 これらの値は、通常、オーバーライドやアクセスが容易ではない制御ロジックから取得される計算値である場合があります。 一部のプロパティは、パーツの切り替えとアニメーション制御する From 値と To 値を対象としているため、関連する TemplateSettings プロパティはペアになります。

TemplateSettings クラスがいくつかあります。 それらのすべては、 .Xaml.Controls.Primitives 名前空間。 各クラスには、関連するコントロールの TemplateSettings プロパティが関連付けられています。 この TemplateSettings プロパティは、コントロールの TemplateSettings 値にアクセスする方法であり、そのプロパティへのテンプレート バインドを確立できます。

関連するクラスとプロパティの例を次に示します。

TemplateSettings プロパティは常に、コードではなく XAML で使用することを目的としています。 これらは、親コントロールの読み取り専用 TemplateSettings プロパティの読み取り専用サブプロパティです。 新しい コントロール ベースのクラスを作成し、コントロール ロジックに影響を与える可能性がある高度なカスタム コントロール シナリオでは、コントロールを再テンプレート化するすべてのユーザーに役立つ可能性のある情報を伝えるために、コントロールにカスタム TemplateSettings プロパティを定義することを検討してください。 そのプロパティの読み取り専用値として、テンプレートの測定やアニメーションの配置などに関連する各情報項目の読み取り専用プロパティを持つ、コントロールに関連する新しい TemplateSettings クラスを定義し、呼び出し元にコントロール ロジックを使用して初期化されたそのクラスのランタイム インスタンスを指定します。 TemplateSettings クラスは DependencyObject から派生するため、プロパティはプロパティ変更コールバックに依存関係プロパティ システムを使用できます。 ただし、 TemplateSettings プロパティは呼び出し元に対して読み取り専用であるため、プロパティの依存関係プロパティ識別子はパブリック API として公開されません。

コントロール テンプレートで TemplateSettings を使用する方法

最初の既定の XAML コントロール テンプレートの例を次に示します。 この特定のテンプレートは、 ProgressRing の既定のテンプレートから取得されています。

<Ellipse
    x:Name="E1"
    Style="{StaticResource ProgressRingEllipseStyle}"
    Width="{Binding RelativeSource={RelativeSource TemplatedParent}, 
        Path=TemplateSettings.EllipseDiameter}"
    Height="{Binding RelativeSource={RelativeSource TemplatedParent}, 
        Path=TemplateSettings.EllipseDiameter}"
    Margin="{Binding RelativeSource={RelativeSource TemplatedParent}, 
        Path=TemplateSettings.EllipseOffset}"
    Fill="{TemplateBinding Foreground}"/>

ProgressRing テンプレートの完全な XAML は数百行なので、これはごく一部の抜粋にすぎません。 この XAML は、不確定な進行のために回転アニメーションを表現する 6 つの 楕円 要素の 1 つであるコントロール パーツを定義します。 開発者は、円が好きではなく、アニメーションの進行に別のグラフィックス プリミティブまたは別の基本図形を使用する場合があります。 たとえば、代わりに四角形に配置された四角形要素のセットを使用する ProgressRing を作成できます。 その場合、新しいテンプレートの各 Rectangle コンポーネントは次のようになります。

<Rectangle
    x:Name="R1"
    Width="{Binding RelativeSource={RelativeSource TemplatedParent}, 
        Path=TemplateSettings.EllipseDiameter}"
    Height="{Binding RelativeSource={RelativeSource TemplatedParent}, 
        Path=TemplateSettings.EllipseDiameter}"
    Margin="{Binding RelativeSource={RelativeSource TemplatedParent}, 
        Path=TemplateSettings.EllipseOffset}"
    Fill="{TemplateBinding Foreground}"/>

ここで TemplateSettings プロパティが役立つのは、ProgressRing の基本的な制御ロジックから得られた計算値であるためです。 この計算では、ProgressRingActualWidthActualHeight 全体を分割し、テンプレート パーツがコンテンツに合ったサイズになるように、そのテンプレート内の各モーション要素に対して計算された測定値をアロケーションします。

既定の XAML コントロール テンプレートのもう 1 つの使用例を次に示します。今回は、アニメーションの FromTo のいずれかのプロパティ セットを示します。 これは ComboBox の既定のテンプレートです。

<VisualStateGroup x:Name="DropDownStates">
    <VisualState x:Name="Opened">
        <Storyboard>
            <SplitOpenThemeAnimation
               OpenedTargetName="PopupBorder"
               ContentTargetName="ScrollViewer"
               ClosedTargetName="ContentPresenter"
               ContentTranslationOffset="0"
               OffsetFromCenter="{Binding RelativeSource={RelativeSource TemplatedParent}, 
                 Path=TemplateSettings.DropDownOffset}"
               OpenedLength="{Binding RelativeSource={RelativeSource TemplatedParent}, 
                 Path=TemplateSettings.DropDownOpenedHeight}"
               ClosedLength="{Binding RelativeSource={RelativeSource TemplatedParent},
                 Path=TemplateSettings.DropDownClosedHeight}" />
        </Storyboard>
   </VisualState>
...
</VisualStateGroup>

ここでも、テンプレートには多くの XAML があるため、抜粋のみを示します。 また、これは、それぞれが同じ ComboBoxTemplateSettings プロパティを使用するいくつかの状態とテーマ アニメーションのうちの 1 つだけです。 ComboBox の場合、バインドを介して ComboBoxTemplateSettings 値を使用すると、テンプレート内の関連するアニメーションが、共有値に基づく位置で停止および開始され、スムーズに遷移します。

TemplateSettings 値をコントロール テンプレートの一部として使用する場合は、値の型に一致するプロパティを設定していることを確認します。 そうでない場合は、バインディングのターゲット型を TemplateSettings 値の別のソース型から変換できるように、バインディングの値コンバーターを作成する必要がある場合があります。 詳細については、「 IValueConverter」を参照してください。