ContentControl と ContentPresenter の違いは何ですか?
-
18-09-2019 - |
質問
いつ使えばいいのかわからない ContentPresenter
の代わりに ContentControl
(およびその逆)。現時点では、私が使用しているのは、 ContentControl
私の中ではほとんどいつも DataTemplate
s.いつだろう ContentPresenter
より良い選択になるでしょうか?なぜ?
解決
ContentControl
他の要素を含み、 Content
-プロパティ (たとえば、 Button
).
ContentPresenter
は、コンテンツを表示するためにコントロール テンプレート内で使用されます。
ContentControl
, は、直接使用される場合 (基本クラスとして使用されることになっています)、ContentPresenter を使用してコンテンツを表示するコントロール テンプレートを持ちます。
私の経験則 (すべてのケースに当てはまるわけではありません。ご自身の判断でお願いします):
- 内部
ControlTemplate
使用ContentPresenter
- の外
ControlTemplate
(含むDataTemplate
および外部テンプレート)それらを使用しないようにしてください。必要に応じて、ContentPresenter
- サブクラス
ContentControl
コンテンツをホストするカスタムの「ルックレス」コントロールを作成していて、既存のコントロールのテンプレートを変更しても同じ結果が得られない場合 (これは非常にまれです)。
他のヒント
のContentPresenterは通常、「ここに実際のコンテンツを置く」と言うためのプレースホルダとして、ControlTemplateの中で使用されます。
ContentControlには、テンプレートでは必ずしも、どこでも使用することができます。それは、それに割り当てられているコンテンツのタイプに定義された任意のDataTemplateをピックアップします。
最近、次の 2 つのコントロールに関する投稿をブログに書きました。
ContentPresenter と ContentControl の比較 (編集:壊れたリンクはアーカイブされたバージョンに置き換えられました。)
の ContentPresenter.ContentSource 実はこれが 2 つのクラスに最大の違いをもたらすものです。ContentSource プロパティは ControlTemplate 内でのみ意味を持ちます。これにより、コンテンツをどの TemplateParent プロパティにマップする必要があるかが決まります。たとえば、コントロールに依存関係プロパティが含まれている場合、 MyProperty1
, 、すると、その中に次のものが見つかるかもしれません ControlTemplate
:
<ControlTemplate TargetType="MyControl" >
[...]
<ContentPresenter ContentSource="MyProperty1" />
[...]
</ControlTemplate>
ContentPresenter のコンテンツは次の値を受け取ります。 MyProperty1
.
宿泊施設の名前が次の場合は、 Content
, 、指定する必要はありません ContentSource
それがデフォルト値であるためです。
angularJ を知っている人向け:これはトランスクルードのメカニズムに似ています。
時々の例では、理論的な専門用語よりも簡単です。 MSのウェブサイトでは(一番下までスクロール:<のhref =「http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter(v=vs.110).aspx」のrel = "nofollowを"> http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter(V = vs.110)の.aspx に)、それは一例として、ボタンを使用し。ボタンは、一つの制御や画像、テキスト、チェックボックス、StackPanelの、グリッド、どんな可能性がカスタムコントロールを配置することができますContentControlにし、持っています。
ボタンのカスタマイズした後、今XAML上で、あなたが書くことができます。
<my:Button>
<my:Button.Content>
<my:AnotherControl>
</my:Button.Content>
</my:Button>
上記のコード例では、「私:Button.Contentは」ContentControlにあります。 AnotherControlはのContentPresenterがどこにあるか、指定したものに場所になります。
テキストボックスとのTextBlockを比較したときに同様に、テキストボックスには、TextBlockにはないのに対し、あなただけの上にあるボタンの例のようにそれで何かを詰め込むするためのContentPresenterを持っています。 TextBlockには、テキストのみを入力することができます。
古い質問ですが、ユニバーサル アプリ用のテンプレート ベースのアニメーション タイル コントロールの開発を終えたところでした。古い 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 がプレゼンターのコンテンツに対して何を行う必要があるかを決定します。