web-dev-qa-db-ja.com

スタイルとControlTemplateの違い

StyleとControlTemplateの主な違いは何ですか?いつ、またはどちらを使用するのですか?

私の目には、まさに同じです。私は初心者なので、私は間違っていると思うので、私の質問です。

60

スタイルでは、コントロールのプロパティを設定します。

<Style x:Key="MyButtonStyle" TargetType="Button">
    <Setter Property="Background" Value="Red"/>
</Style>

<Button Style="{StaticResource MyButtonStyle}"/>

このスタイルを使用するすべてのボタンの背景は赤に設定されます。

テンプレートでは、コントロールのUI(構造)を定義します。

<ControlTemplate x:Key="MyButtonTemplate" TargetType="Button">
    <Grid>
        <Rectangle Fill="Green"/>
        <ContentPresenter/>
    </Grid>
</ControlTemplate>

<Button Template="{StaticResource MyButtonTemplate}"/>

このテンプレートを使用するボタンはすべて、変更できない緑の背景になります。

テンプレートで設定された値は、テンプレート全体を置き換えることによってのみ置き換えることができます。 styleの値は、コントロールを使用するときに値を明示的に設定することで置き換えることができます。そのため、値をコーディングする代わりにTemplateBindingを使用して、コントロールのプロパティを使用する方が適切です。

<ControlTemplate x:Key="MyButtonTemplate" TargetType="Button">
    <Grid>
        <Rectangle Fill="{TemplateBinding Background}"/>
        <ContentPresenter/>
    </Grid>
</ControlTemplate>

これで、テンプレートは適用されるボタンのBackgroundプロパティの値を使用するため、カスタマイズできます。

<Button Template="{StaticResource MyButtonTemplate}" Background="Yellow"/>

別の便利な機能は、コントロールに特定のスタイルを割り当てることなく、デフォルトのスタイルを選択できることです。テンプレートではできません。

スタイルのx:Key属性を削除するだけです(繰り返しますが、テンプレートではこれを行えません)。スタイルの下にあるビジュアルツリーのすべてのボタンには、このスタイルが適用されます。

テンプレートとスタイルの組み合わせは非常に強力です。スタイルのTemplateプロパティを設定できます。

<Style TargetType="Button">
    <Setter Property="Background" Value="Red"/>
    <Setter Property="Template">
        <Setter.Value>
             <ControlTemplate TargetType="Button">
                 <Grid>
                     <Rectangle Fill="{TemplateBinding Background"/>
                     <ContentPresenter/>
                 </Grid>
             </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
71
Erno de Weerd

いいえ、あなたはまったく間違っています。 スタイルはプロパティを設定しますコントロール。 ControlTemplateはプロパティですレンダリング方法を指定するほとんどのコントロールで共有されます。

詳細に説明すると、スタイルを使用して一連のプロパティの設定をグループ化し、それを再利用してコントロールを標準化できます。スタイルは、コントロールに明示的に設定することも、特定のタイプすべてに適用することもできます。

コントロールテンプレートは、スタイルによって設定するか、コントロールに明示的に設定して表示方法を変更できます。すべてのコントロールには、.net wpfアセンブリに埋め込まれた既定のテンプレート(およびそのためのスタイル)があります。これらを見て、wpf開発者がすべてのコントロールの通常バージョンをどのように実装したかを理解することは非常に有益です。 Expression blendがインストールされている場合は、その「SystemThemes」フォルダーを見てください。

更新:

スタイルとControlTemplatesが「コントロールを追加」する方法を理解するため。何らかの方法で、ControlTemplateは、コントロールが構成されるコントロールを定義する唯一の方法です。ただし、一部のデフォルトの.netコントロールでは、テキストの代わりにコントロールを使用できます。

例えば:

<GroupBox>
  <GroupBox.Header>
    <CheckBox/>
  </GroupBox.Header>
</GroupBox>

これはControlTemplateを変更せずにグループボックスにチェックボックスを「追加」しますが、これはControlTemplateのデフォルトGroupBoxはヘッダーとして何でも許可するため 。これは、ContentPresenterなどの特別なコントロールを使用して行われます。

ただし、コントロールのデフォルトのControlTemplateでは、プロパティを介して変更したいものを変更できない場合があります。次に、ControlTemplateを変更する必要があります。

コントロールのプロパティ(コンテンツ、ヘッダー、ControlTemplate、IsEnabledなど)を直接設定するか、スタイルを介して設定するかは問題ではありません。スタイルは便利なだけです。

うまくいけば、これはあなたの質問にもっと明確に答えます。

23
Andre Luus

スタイルは、プロパティ値のセットを複数の要素に適用する便利な方法と考えることができます。各TextBlock要素にFontSizeやFontFamilyなどのプロパティを直接設定することにより、デフォルトの外観を変更できます。ただし、TextBlock要素でいくつかのプロパティを共有する場合は、XAMLファイルのResourcesセクションでスタイルを作成できます。

一方、ControlTemplateは、コントロールの視覚的な構造と視覚的な動作を指定します。新しいControlTemplateを与えることにより、コントロールの外観をカスタマイズできます。 ControlTemplateを作成すると、機能を変更せずに既存のコントロールの外観を置き換えます。たとえば、アプリケーションのボタンをデフォルトの正方形の代わりに丸くすることができますが、ボタンはClickイベントを発生させます。

参照: http://msdn.Microsoft.com/en-us/library/ms745683.aspx

14
Teoman Soygul

スタイルとテンプレートの違い(msdn) にいくつかの興味深い違いが見つかりました

スタイル:スタイルに既存のみプロパティを設定できます。たとえば、テンプレートに追加した新しいパーツに属するプロパティにデフォルト値を設定することはできません。

テンプレート:テンプレートを変更すると、コントロールのより多くの部分にアクセスできますスタイルを変更した場合よりも。たとえば、コンボボックスでのポップアップリストの表示方法を変更したり、アイテムテンプレートを変更して、コンボボックスでポップアップリストをトリガーするボタンの外観を変更したりできます。


Style:スタイルを使用して、コントロールのデフォルトの動作を指定できます。たとえば、ボタンのスタイルでは、トリガーを指定して、ユーザーがマウスポインターをボタンの上に移動したときに背景色が変更されるようにすることができます。これらのプロパティの変更は瞬間的です(それらは徐々にアニメーション化することはできません)。

Template:トリガーを使用して、テンプレート内の新規および既存のパーツの動作を指定できます。たとえば、トリガーを指定して、ユーザーがマウスポインターをボタンの上に移動すると、パーツの1つの色が変わるようにすることができます。これらのプロパティの変更は、瞬時に行うことも、スムーズに移行するために徐々にアニメーション化にすることもできます。

2
Bakri Bitar

OK、まったく同じ質問があり、このスレッドで見つけた答えは正しい方向を教えてくれたので、私はそれを共有しています。

スタイルはControlTemplateよりも柔軟です。

Windows Presentation Foundation Unleashedから、Adam Nathanとギャング(作家)は次のように述べています。

  • 「テンプレートを[スタイルのControlTemplateセッターを使用するスタイルと]任意のプロパティ設定と組み合わせる便利さに加えて、これを実行することの重要な利点があります[スタイルにControlTemplateセッターを設定する]:

    1. デフォルトのテンプレートの効果が得られます。たとえば、入力したスタイルがデフォルトで要素に適用され、そのスタイルにカスタムコントロールテンプレートが含まれている場合、コントロールテンプレートはそれらの要素に明示的にマークを付けずに適用されます。
    2. テンプレートの外観を制御する、デフォルトでありながらオーバーライド可能なプロパティ値を提供できます。つまり、テンプレート化された親のプロパティを尊重しながら、独自のデフォルト値を提供することができます。」

つまり、スタイルを作成すると、スタイルのテンプレートセッターのユーザーは、TemplateBinding({TemplateBinding Width}など)を使用していなくても、設定された値をオーバーライドできます。スタイルでWidthをハードコーディングした場合、Styleのユーザーはそれをオーバーライドできますが、TemplateでそのWidthプロパティをハードコーディングした場合、ユーザーはそれでスタックします。

また、ContentBindingをTemplateBindingで使用する場合、ユーザーにそのプロパティを設定する責任があります。そうでない場合、TargetTypeのデフォルトプロパティが使用されます。スタイルを使用する場合、プロパティのセッターを使用し、そのセッターを参照するTemplateBindingを適用することにより、TargetTypeのデフォルトプロパティをオーバーライドできます。本はそれをより良く説明している、338ページ(テンプレートとスタイルの混合)

0
John C