ContentControl
(またはその逆)の代わりにContentPresenter
を使用するときはわかりません。現時点では、私はDataTemplate
でいつもほとんどContentControl
を使用しています。 ContentPresenter
はいつより良い選択ですか?なぜ?ContentControlとContentPresenterの違いは何ですか?
答えて
は、他の要素を含むコントロールの基本クラスで、のプロパティ(たとえば、Button
)を持ちます。
ContentPresenter
は、コントロールテンプレート内でコンテンツを表示するために使用されます。
ContentControl
は、直接使用すると(基本クラスとして使用するはずです)、ContentPresenterを使用してコンテンツを表示するコントロールテンプレートがあります。
EDIT:親指の私のルール(すべてのケースでは適用できない、あなたの判断を使用):
ControlTemplate
の外ControlTemplate
使用ContentPresenter
- インサイド(
DataTemplate
と外側のテンプレートを含む)はいずれも使用しないようにしようあなたがする必要がある場合は、それらの、あなたはそれがすべき(カスタムを作成している場合ContentPresenter
- サブクラス
ContentControl
を好む「lookless」というホストコンテンツを制御し、既存のコントロールのテンプレートを変更することで同じ結果を得ることができない必要があります非常にまれです)。
ContentPresenterは、通常、「実際のコンテンツをここに入れる」というプレースホルダとしてControlTemplateで使用されます。
ContentControlは、テンプレート内でなくても、どこでも使用できます。
ContentPresenterもDataTemplateをコンテンツに適用しませんか?それがその主な目的の一つではありませんか? –
mmm ...そうです、おそらく。とにかく、Bea Stollnitzの説明は私のものよりはるかに優れています;) –
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に似ています。
場合によっては、理論上の専門用語よりも簡単な例があります。 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では、テキストの入力のみが可能です。
['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'を使ってそれを行うことができます。カスタマイズする必要はありません。 –
しかし、この答えは、「ContentPresenter」の代わりに「ContentControl」を 'ControlTemplate'でも' Button'の内容を表示するために使うことができなかった理由と理由を説明していません。したがって、それは質問に答えません。 –
その古い質問が、私はちょうど古い電話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
を使用してください。少なくとも、WP7/8 SDKを開発したときにMicrosoftが行ったことと同じです。 ContentControlはコンテンツの表示にも使用できますが、コンテナとプレゼンターの両方として機能します。したがって、上のサンプルコードでは、目的はコンテナとプレゼンタで分割されています。ダイナミックサンプルでは、コンテナを表示することができます(コンテナは空の背景やそれ以外のものを持つことができます)。コンテナには寸法(幅、高さなど)があり、それらのプロパティをコンテナコントロールに置き、コンテンツを表示します。サンプルでは、ContentControlはプレゼンターのコンテンツで何が行われるべきかを判断します。
- 1. ContentControlのContentPresenterオーバーレイ要素
- 2. $と$$の違いは何ですか?
- 3. `##`と `hashCode`の違いは何ですか?
- 4. typedefとの違いは何ですか?
- 5. NodeJS:「./ ..」と「..」の違いは何ですか?
- 6. {}())と{})の違いは何ですか?
- 7. `&`と `ref`の違いは何ですか?
- 8. `==`と `is`の違いは何ですか?
- 9. difftimeと ' - 'の違いは何ですか?
- 10. #{} $ {}と%{}の違いは何ですか?
- 11. ⊕と+の違いは何ですか?
- 12. アペンダーと〜の違いは何ですか?
- 13. "./"と "../"の違いは何ですか?
- 14. "$^N"と "$ +"の違いは何ですか?
- 15. %Qと%{}の違いは何ですか?
- 16. バックスティックと$()の違いは何ですか?
- 17. A`と ``の違いは何ですか[:] `
- 18. パッケージのインポートobjと何かの違いをインポートパッケージとPythonの何かの違いは何ですか?
- 19. METADATAとMETADATA.jl:違いは何ですか?
- 20. twistdとnohup&:違いは何ですか?
- 21. libspeとlibspe2?違いは何ですか?
- 22. Backbone.jsとPusherapp - 違いは何ですか?
- 23. wp_link_pagesとthe_posts_pagination→違いは何ですか?
- 24. $ dirtyと$ invalid:違いは何ですか?
- 25. XPathの//と?/の違いは何ですか?の使用は何
- 26. フレームとオブジェクトの違いは何ですか?フレームとオブジェクトの違いは何ですか?
- 27. リストと何か([_])と何か(_)の違い
- 28. 違いは何ですか?
- 29. 違いは何ですか?
- 30. Javaではargsとargghとargvの違いは何ですか?
これは、DataTemplateの中でContentPresenterを使うべきでしょうか?それはもっと軽量ですが(このようなDataTemplateで使用すると機能的に同等です)新しいコントロールを作成している場合は、基本クラスとしてContentControlを使用します。 – Wilka
私はContentPresenterとContentControlを使用するとき、より詳細な答えを編集しました – Nir
Ok ContentControlの代わりにContentPresenterをテンプレートで使用するべきだと思っていますが、なぜですか? – sll