什么是ContentControl中和ContentPresenter之间的区别?(What'

2019-06-18 12:43发布

我不知道我何时应该使用ContentPresenter ,而不是ContentControl (反之亦然)。 目前,我使用ContentControl几乎所有的时间在我DataTemplate秒。 当将ContentPresenter是一个更好的选择吗? 为什么?

Answer 1:

ContentControl对于包含其他元素,并且具有控制基类Content -property(例如, Button )。

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

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

我的经验法则(不适用在任何情况下,使用你的判断):

  1. 内部ControlTemplate使用ContentPresenter
  2. 外面ControlTemplate (包括DataTemplate ,外模板)尽量不使用其中任何一个,如果你需要,你必须喜欢ContentPresenter
  3. 子类ContentControl如果要创建一个自定义的“无外观的”控制主机的内容,你可以不更改现有控件的模板(应该是极为罕见)得到同样的结果。


Answer 2:

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

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



Answer 3:

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

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

ContentPresenter.ContentSource就是实际上使得两个类之间的最大区别。 ContentSource特性使得仅在控件模板感; 它确定哪个TemplatedParent属性内容应被映射。 例如,如果一个控件包含依赖属性MyProperty1 ,那么我们可能会发现其内的下列ControlTemplate

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

在ContentPresenter的内容将获得价值MyProperty1

请注意,如果属性的名称是Content ,没有必要指定ContentSource ,因为它是默认值。

对于那些谁知道angularJs:这类似于transclude mecanism。



Answer 4:

有时,一个例子是不是理论行话容易。 在MS网站(滚动到底: http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter(v=vs.110).aspx ),它使用一个按钮一个例子。 按钮具有一个ContentControl中,它允许你把一个控制,或者可能是图片,文字,复选框,StackPanel中,网格,无论自定义的控制。

按键的自定义后,现在在XAML中,你可以写

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

在上面的示例代码中,“我的:Button.Content”是ContentControl中。 该AnotherControl将成为地方您指定了什么,其中ContentPresenter是。

同样,当比较TextBox和TextBlock的,文本框有一个ContentPresenter给你东西的东西在里面,就像上面的按钮的例子,而一个TextBlock没有。 一个TextBlock只允许你输入文字。



Answer 5:

一个老问题,但我刚刚完成开发一个动画区块控制,基于一个通用的应用程序模板,看看从旧手机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中决定了必须与演讲内容做了。



文章来源: What's the difference between ContentControl and ContentPresenter?