我不确定什么时候应该使用 ContentPresenter 代替 ContentControl (反之亦然)。目前,我正在使用 ContentControl 几乎一直在我的 DataTemplates。什么时候会 ContentPresenter 是一个更好的选择吗?为什么?

有帮助吗?

解决方案

ContentControl 是一个基类控制含有其他要素,并有一个 Content-财产(例如, Button).

ContentPresenter 用内部控制模板显示的内容。

ContentControl, 当直接使用(这本来应该被用作一个基类),有一个控制模板的使用ContentPresenter来显示它的内容。

我的法则(不适用于每种情况下,使用你的判断):

  1. 内部 ControlTemplate 使用 ContentPresenter
  2. 外面的 ControlTemplate (包括 DataTemplate 外模板)尽量不要使用任何人,如果需要,你必须喜欢 ContentPresenter
  3. 子类 ContentControl 如果你正在创建一个自定义的"lookless"控制,主内容和你不能得到同样的结果通过改变现有的控制的模板(这应该是非常罕见的).

其他提示

ContentPresenter通常在使用的ControlTemplate,作为占位符说“放在这里的实际内容”。

一个ContentControl中可以在模板在任何地方使用,不一定。它会拿起分配给它的内容的类型定义的任何的DataTemplate

我最近写了一篇关于我的博客的一篇文章就这两个控件:

ContentPresenter VS ContentControl中(编辑:断开的链接替换存档版本)

ContentPresenter.ContentSource 是什么实际上使两个类之间的最大区别。 ContentSource特性使得仅在控件模板感;它确定哪个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,它允许您放置一个控件或自定义控件,可以是图像、文本、复选框、StackPanel、网格等。

Button定制完成后,现在在Xaml上,可以这样写

<my:Button>
   <my:Button.Content>
      <my:AnotherControl>
   </my:Button.Content>
</my:Button>

在上面的示例代码中,“my:Button.Content”是ContentControl。AnotherControl 将放置在您指定的 ContentPresenter 所在位置。

同样,当比较 TextBox 和 TextBlock 时,TextBox 有一个 ContentPresenter 供您在其中填充内容,就像上面的 Button 示例一样,而 TextBlock 则没有。TextBlock 只允许您输入文本。

一个老问题,但我刚刚完成开发一个动画区块控制,基于一个通用的应用程序模板,看看这段代码从旧手机WP7 / 8 SDK:

<ContentControl x:Name="contentControl" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalAlignment="Stretch" VerticalContentAlignment="Stretch">
    <ContentPresenter x:Name="contentPresenter" CacheMode="BitmapCache"/>
</ContentControl>

下面可以看到ContentControl中是所述容器和所述演示用于显示内容。在大多数情况下,控件模板将是集装箱,但如果你在你的ControlTemplate想另一个容器,你可以把一个额外的容器:ContentControl在它和呈现内容分ContentPresenter。如果你不需要一个单独的容器就用ControlTemplateControlPresenters显示内容块至少那是当他们开发的WP7 / 8 SDK什么在微软的家伙一样。所述ContentControl中也可使用用于显示内容,但随后既用作容器和主持人。因此,在上述其目的的样本代码在集装箱和演示被分裂。在动态的样本,可以显示容器(它可以有一个空的背景或那东西现在还没有),然后动态地与演示内容填充它。容器具有尺寸(宽度,高度等),你把这些属性在容器控制并在其上呈现内容。在该样品中的ContentControl中确定哪些必须被与演示内容进行。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top