我不知道我何时应该使用ContentPresenter
,而不是ContentControl
(反之亦然)。 目前,我使用ContentControl
几乎所有的时间在我DataTemplate
秒。 当将ContentPresenter
是一个更好的选择吗? 为什么?
Answer 1:
ContentControl
对于包含其他元素,并且具有控制基类Content
-property(例如, Button
)。
ContentPresenter
用于内部控制模板来显示内容。
ContentControl
,直接使用时(它应该被用作基类),具有使用ContentPresenter来显示它的内容的控制模板。
我的经验法则(不适用在任何情况下,使用你的判断):
- 内部
ControlTemplate
使用ContentPresenter
- 外面
ControlTemplate
(包括DataTemplate
,外模板)尽量不使用其中任何一个,如果你需要,你必须喜欢ContentPresenter
- 子类
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
。 如果你不需要一个单独的容器中,然后只需使用ControlTemplate
和ControlPresenters
显示内容块至少那是当他们开发的WP7 / 8 SDK什么在微软的家伙一样。 所述ContentControl中也可使用用于显示内容,但随后既用作容器和主持人。 因此,在上述其目的的样本代码在集装箱和演示被分裂。 在动态的样本,可以显示容器(它可以有一个空的背景或那东西现在还没有),然后动态地与演示内容填充它。 容器具有尺寸(宽度,高度等),你把这些属性在容器控制并在其上呈现内容。 在样品ContentControl中决定了必须与演讲内容做了。