回答:
ContentControl
他の要素を含み、- Content
プロパティを持つコントロールの基本クラスです(たとえば、Button
)。
ContentPresenter
コンテンツを表示するためにコントロールテンプレート内で使用されます。
ContentControl
を直接使用する場合(基本クラスとして使用することになっています)、ContentPresenterを使用してコンテンツを表示するコントロールテンプレートがあります。
私の経験則(すべての場合に当てはまるわけではありません、あなたの判断を使用してください):
ControlTemplate
使用ContentPresenter
ControlTemplate
(DataTemplate
テンプレートを含む、外部のテンプレート)のいずれも使用しないようにします。必要な場合は、優先する必要があります。ContentPresenter
ContentControl
コンテンツをホストするカスタムの「ルックレス」コントロールを作成していて、既存のコントロールのテンプレートを変更しても同じ結果を得ることができない場合は、サブクラス化します(これは非常にまれです)。ContentPresenterは通常、「実際のコンテンツをここに置く」と言うプレースホルダーとして、ControlTemplateで使用されます。
ContentControlは、必ずしもテンプレート内ではなく、どこでも使用できます。割り当てられたコンテンツのタイプに定義されているDataTemplateを取得します
私は最近、これら2つのコントロールについてブログに投稿しました。
ContentPresenterとContentControl(編集:リンク切れはアーカイブバージョンに置き換えられました。)
ContentPresenter.ContentSourceは、実際には、二つのクラスの最大の違いを作るものです。ContentSourceプロパティは、ControlTemplate内でのみ意味があります。コンテンツのマッピングに使用するTemplatedParentプロパティを決定します。たとえば、コントロールに依存関係プロパティが含まれている場合、MyProperty1
その中に以下が見つかる可能性がありますControlTemplate
。
<ControlTemplate TargetType="MyControl" >
[...]
<ContentPresenter ContentSource="MyProperty1" />
[...]
</ControlTemplate>
ContentPresenterのコンテンツはの値を受け取りますMyProperty1
。
プロパティの名前がの場合は、デフォルト値Content
なので指定する必要はありませんContentSource
。
angularJsを知っている人のために:これはメカニズムのトランクルードに似ています。
それは古い質問ですが、私はアニメーション化されたTile Control(ユニバーサルアプリ用のテンプレートに基づくテンプレート)の開発を終えたところです。古いPhone 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
ます。別のコンテナーが必要ない場合はControlTemplate
、ControlPresenters
コンテンツブロックを表示するために、少なくともMicrosoftの人がWP7 / 8 SDKを開発したときに行ったのと同じことです。ContentControlはコンテンツの表示にも使用できますが、コンテナーとプレゼンターの両方として機能します。上記のサンプルコードでは、その目的はコンテナとプレゼンターに分かれています。動的サンプルでは、コンテナーを表示し(空の背景またはまだ存在しないものがある可能性があります)、プレゼンターコンテンツを動的に入力できます。コンテナには寸法(幅、高さなど)があり、それらのプロパティをコンテナコントロールに配置してコンテンツを表示します。サンプルでは、ContentControlがプレゼンターコンテンツで実行する必要があることを決定します。
例は理論的な専門用語よりも簡単な場合があります。MS Webサイト(下部までスクロール:http : //msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter (v= vs.110).aspx ))では、ボタンを次のように使用します例。ButtonにはContentControlがあり、1つのコントロール、または画像、テキスト、チェックボックス、スタックパネル、グリッドなどのカスタムコントロールを配置できます。
Buttonのカスタマイズ後、Xamlで次のように書くことができます
<my:Button>
<my:Button.Content>
<my:AnotherControl>
</my:Button.Content>
</my:Button>
上記のコード例では、「my:Button.Content」はContentControlです。AnotherControlは、ContentPresenterがある場所を指定した場所に配置されます。
同様に、TextBoxとTextBlockを比較すると、上記のButtonの例のように、TextBoxにはコンテンツプレゼンターがあり、TextBlockにはありません。TextBlockはテキストの入力のみを許可します。
Button
は[ ](msdn.microsoft.com/en-us/library/system.windows.controls.contentcontrol(v = vs.110).aspx)がありません。ContentControl
これは(継承)ContentControl
です。にはButton
がありContentPresenter
ます。これを標準のButton
で行うことができ、カスタマイズする必要がないことに注意してください。
ContentPresenter
、ContentControl
でちょうど同様に使用することができなかったControlTemplate
のコンテンツを表示しますButton
。そのため、質問には答えません。