218

ContentPresenter代わりにいつ使用する必要があるかわかりませんContentControl(およびその逆)。ContentControl現在、私は私のsでほぼ常に使用していDataTemplateます。ContentPresenterより良い選択はいつですか?なぜ?

4

5 に答える 5

179

ContentControlは、他の要素を含み、Content-property(たとえばButton)を持つコントロールの基本クラスです。

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

ContentControl、直接使用すると(基本クラスとして使用されることになっています)、ContentPresenterを使用してコンテンツを表示するコントロールテンプレートがあります。

私の経験則(すべての場合に適用できるわけではありません。あなたの判断を使用してください):

  1. 内部ControlTemplate使用ContentPresenter
  2. 外部ControlTemplateDataTemplateおよび外部テンプレートを含む)では、それらのいずれも使用しないようにしてください。必要に応じて、ContentPresenter
  3. ContentControlコンテンツをホストするカスタムの「ルックレス」コントロールを作成していて、既存のコントロールのテンプレートを変更しても同じ結果が得られない場合は、サブクラスを作成します(これは非常にまれです)。
于 2009-08-17T14:44:41.537 に答える
25

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

ContentControl は、必ずしもテンプレート内ではなく、どこでも使用できます。割り当てられたコンテンツのタイプに対して定義された DataTemplate を取得します。

于 2009-08-17T13:37:15.623 に答える
9

私は最近、これら 2 つのコントロールに関するブログ記事を書きました。

ContentPresenter と ContentControl

ContentPresenter.ContentSourceは、実際に 2 つのクラスの最大の違いを生むものです。ContentSource プロパティは、ControlTemplate 内でのみ意味があります。コンテンツをマップする必要がある TemplatedParent プロパティを決定します。たとえば、コントロールに依存関係プロパティが含まれている場合、MyProperty1その 内に次のものが見つかる可能性がありますControlTemplate

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

ContentPresenter のコンテンツは の値を受け取りますMyProperty1

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

angularJs を知っている人向け: これはトランスクルード機構に似ています。

于 2012-11-19T10:30:56.080 に答える
2

古い質問ですが、ユニバーサル アプリ用のテンプレート ベースのアニメーション タイル コントロールの開発を終えたところです。古い 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 を入れることができます。別のコンテナが必要ない場合は、とを使用してくださいContentControlContentPresenterControlTemplateControlPresentersコンテンツ ブロックを表示するために、少なくとも Microsoft の担当者が WP7/8 SDK を開発したときに行ったことです。ContentControl はコンテンツの表示にも使用できますが、コンテナーとプレゼンターの両方として機能します。したがって、上記のサンプル コードでは、その目的は Container と Presenter に分かれています。動的サンプルでは、​​コンテナーを表示し (空の背景またはまだ存在しないものを含むことができます)、プレゼンター コンテンツで動的に満たすことができます。コンテナーには寸法 (幅、高さなど) があり、それらのプロパティをコンテナー コントロールに配置し、その上にコンテンツを表示します。サンプルでは、​​ContentControl がプレゼンター コンテンツで何をする必要があるかを決定します。

于 2014-04-25T21:29:20.940 に答える
0

理論的な専門用語よりも例の方が簡単な場合があります。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 では、テキストの入力のみが許可されます。

于 2014-01-23T19:59:07.557 に答える