2009-08-17 8 views
176

ContentControl(またはその逆)の代わりにContentPresenterを使用するときはわかりません。現時点では、私はDataTemplateでいつもほとんどContentControlを使用しています。 ContentPresenterはいつより良い選択ですか?なぜ?ContentControlとContentPresenterの違いは何ですか?

答えて

142

は、他の要素を含むコントロールの基本クラスで、のプロパティ(たとえば、Button)を持ちます。

ContentPresenterは、コントロールテンプレート内でコンテンツを表示するために使用されます。

ContentControlは、直接使用すると(基本クラスとして使用するはずです)、ContentPresenterを使用してコンテンツを表示するコントロールテンプレートがあります。

EDIT:親指の私のルール(すべてのケースでは適用できない、あなたの判断を使用):

  1. ControlTemplateの外ControlTemplate使用ContentPresenter
  2. インサイド(DataTemplateと外側のテンプレートを含む)はいずれも使用しないようにしようあなたがする必要がある場合は、それらの、あなたはそれがすべき(カスタムを作成している場合ContentPresenter
  3. サブクラスContentControlを好む「lookless」というホストコンテンツを制御し、既存のコントロールのテンプレートを変更することで同じ結果を得ることができない必要があります非常にまれです)。
+1

これは、DataTemplateの中でContentPresenterを使うべきでしょうか?それはもっと軽量ですが(このようなDataTemplateで使用すると機能的に同等です)新しいコントロールを作成している場合は、基本クラスとしてContentControlを使用します。 – Wilka

+0

私はContentPresenterとContentControlを使用するとき、より詳細な答えを編集しました – Nir

+1

Ok ContentControlの代わりにContentPresenterをテンプレートで使用するべきだと思っていますが、なぜですか? – sll

20

ContentPresenterは、通常、「実際のコンテンツをここに入れる」というプレースホルダとしてControlTemplateで使用されます。

ContentControlは、テンプレート内でなくても、どこでも使用できます。

+6

ContentPresenterもDataTemplateをコンテンツに適用しませんか?それがその主な目的の一つではありませんか? –

+1

mmm ...そうです、おそらく。とにかく、Bea Stollnitzの説明は私のものよりはるかに優れています;) –

8

I最近、これらの2つのコントロールについての私のブログに記事を書いた:

ContentPresenter vs ContentControl(EDIT:アーカイブされたバージョンに置き換えリンク切れ)

ContentPresenter.ContentSourceが実際に作るものです2つのクラスの最大の違い。 ContentSourceプロパティは、ControlTemplate内でのみ意味を持ちます。コンテンツをどのTemplatedParentプロパティでマップするかを決定します。コントロールは、依存関係プロパティMyProperty1が含まれている場合たとえば、我々はそのControlTemplate内で次の 見つけるかもしれない:

<ControlTemplate TargetType="MyControl" > 
    [...] 
     <ContentPresenter ContentSource="MyProperty1" /> 
    [...] 
</ControlTemplate> 

のContentPresenterの内容はMyProperty1の値を受け取ります。

プロパティの名前がContentの場合、デフォルト値であるContentSourceを指定する必要はありません。

angularJsを知っている人のために、これはtransclude mecanismに似ています。

0

場合によっては、理論上の専門用語よりも簡単な例があります。 MSウェブサイト(下にスクロール:http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter(v=vs.110).aspx)では、例としてボタンを使用しています。ButtonにはContentControlがあり、画像、テキスト、CheckBox、StackPanel、Gridなど、1つのコントロールまたはカスタムコントロールを配置することができます。 ContentControlにある:今XAMLのボタンのカスタマイズ、後

、あなたは「Button.Content私」、上記のコード例では

<my:Button> 
    <my:Button.Content> 
     <my:AnotherControl> 
    </my:Button.Content> 
</my:Button> 

を書くことができます。 AnotherControlは、ContentPresenterがどこにあるか指定した場所に配置されます。

同様に、TextBoxとTextBlockを比較すると、TextBoxには上記のButtonの例のように内容を埋め込むContentPresenterがありますが、TextBlockはそうではありません。 TextBlockでは、テキストの入力のみが可能です。

+1

['Button'](http://msdn.microsoft.com/en-us/library/system.windows.controls.button%28v=vs.110%29.aspx)には* a * ContentControl'](msdn.microsoft.com/en-us/library/system.windows.controls.contentcontrol(v = vs.110).aspx)、*は(ContentControlから継承された)*です。 'Button' *は* [' ContentPresenter'](http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter%28v=vs.110%29.aspx)を持っています。標準の 'Button'を使ってそれを行うことができます。カスタマイズする必要はありません。 –

+0

しかし、この答えは、「ContentPresenter」の代わりに「ContentControl」を 'ControlTemplate'でも' Button'の内容を表示するために使うことができなかった理由と理由を説明していません。したがって、それは質問に答えません。 –

0

その古い質問が、私はちょうど古い電話WP7/8 SDKからこのコードを見て、ユニバーサルアプリのために基づいて、アニメーション・タイルのコントロール、テンプレートを開発して仕上げました:

ここ
<ContentControl x:Name="contentControl" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalAlignment="Stretch" VerticalContentAlignment="Stretch"> 
    <ContentPresenter x:Name="contentPresenter" CacheMode="BitmapCache"/> 
</ContentControl> 

あなたが見ることができますContentControlはコンテンツを表示するためのコンテナとプレゼンタです。ほとんどの場合、ControlTemplateはコンテナになりますが、ControlTemplate別のコンテナ内に追加のコンテナ:ContentControlを入れ、コンテンツを別途ContentPresenterとして提示することができます。別のコンテナが必要ない場合は、コンテンツブロックを表示するのに少なくともControlTemplateControlPresentersを使用してください。少なくとも、WP7/8 SDKを開発したときにMicrosoftが行ったことと同じです。 ContentControlはコンテンツの表示にも使用できますが、コンテナとプレゼンターの両方として機能します。したがって、上のサンプルコードでは、目的はコンテナとプレゼンタで分割されています。ダイナミックサンプルでは、​​コンテナを表示することができます(コンテナは空の背景やそれ以外のものを持つことができます)。コンテナには寸法(幅、高さなど)があり、それらのプロパティをコンテナコントロールに置き、コンテンツを表示します。サンプルでは、​​ContentControlはプレゼンターのコンテンツで何が行われるべきかを判断します。

関連する問題