ContentPresenter
代わりにいつ使用する必要があるかわかりませんContentControl
(およびその逆)。ContentControl
現在、私は私のsでほぼ常に使用していDataTemplate
ます。ContentPresenter
より良い選択はいつですか?なぜ?
5 に答える
ContentControl
は、他の要素を含み、Content
-property(たとえばButton
)を持つコントロールの基本クラスです。
ContentPresenter
コントロールテンプレート内でコンテンツを表示するために使用されます。
ContentControl
、直接使用すると(基本クラスとして使用されることになっています)、ContentPresenterを使用してコンテンツを表示するコントロールテンプレートがあります。
私の経験則(すべての場合に適用できるわけではありません。あなたの判断を使用してください):
- 内部
ControlTemplate
使用ContentPresenter
- 外部
ControlTemplate
(DataTemplate
および外部テンプレートを含む)では、それらのいずれも使用しないようにしてください。必要に応じて、ContentPresenter
ContentControl
コンテンツをホストするカスタムの「ルックレス」コントロールを作成していて、既存のコントロールのテンプレートを変更しても同じ結果が得られない場合は、サブクラスを作成します(これは非常にまれです)。
ContentPresenter は通常、「実際のコンテンツをここに置く」というプレースホルダーとして ControlTemplate で使用されます。
ContentControl は、必ずしもテンプレート内ではなく、どこでも使用できます。割り当てられたコンテンツのタイプに対して定義された DataTemplate を取得します。
私は最近、これら 2 つのコントロールに関するブログ記事を書きました。
ContentPresenter と ContentControl
ContentPresenter.ContentSourceは、実際に 2 つのクラスの最大の違いを生むものです。ContentSource プロパティは、ControlTemplate 内でのみ意味があります。コンテンツをマップする必要がある TemplatedParent プロパティを決定します。たとえば、コントロールに依存関係プロパティが含まれている場合、MyProperty1
その 内に次のものが見つかる可能性がありますControlTemplate
。
<ControlTemplate TargetType="MyControl" >
[...]
<ContentPresenter ContentSource="MyProperty1" />
[...]
</ControlTemplate>
ContentPresenter のコンテンツは の値を受け取りますMyProperty1
。
プロパティの名前が の場合は、デフォルト値Content
なので指定する必要はありません。ContentSource
angularJs を知っている人向け: これはトランスクルード機構に似ています。
古い質問ですが、ユニバーサル アプリ用のテンプレート ベースのアニメーション タイル コントロールの開発を終えたところです。古い 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 は Container になりますが、別のコンテナーに入れたい場合はControlTemplate
、追加の Container を入れることができます。別のコンテナが必要ない場合は、とを使用してくださいContentControl
ContentPresenter
ControlTemplate
ControlPresenters
コンテンツ ブロックを表示するために、少なくとも Microsoft の担当者が WP7/8 SDK を開発したときに行ったことです。ContentControl はコンテンツの表示にも使用できますが、コンテナーとプレゼンターの両方として機能します。したがって、上記のサンプル コードでは、その目的は Container と Presenter に分かれています。動的サンプルでは、コンテナーを表示し (空の背景またはまだ存在しないものを含むことができます)、プレゼンター コンテンツで動的に満たすことができます。コンテナーには寸法 (幅、高さなど) があり、それらのプロパティをコンテナー コントロールに配置し、その上にコンテンツを表示します。サンプルでは、ContentControl がプレゼンター コンテンツで何をする必要があるかを決定します。
理論的な専門用語よりも例の方が簡単な場合があります。MS Web サイト (一番下までスクロール: http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter(v=vs.110).aspx ) では、ボタンを次のように使用します。例。Button には ContentControl があり、1 つのコントロールまたは Image、Text、CheckBox、StackPanel、Grid などのカスタム コントロールを配置できます。
Button のカスタマイズ後、Xaml で次のように記述できます。
<my:Button>
<my:Button.Content>
<my:AnotherControl>
</my:Button.Content>
</my:Button>
上記のコード例では、「my:Button.Content」が ContentControl です。AnotherControl は、ContentPresenter がある場所で指定した場所に配置されます。
同様に、TextBox と TextBlock を比較すると、TextBox には、上記の Button の例のようにコンテンツを詰め込むための ContentPresenter がありますが、TextBlock にはありません。TextBlock では、テキストの入力のみが許可されます。