ContentControl和ContentPresenter有什么区别?

我不知道何时应该使用ContentPresenter而不是ContentControl (反之亦然)。 目前,我在DataTemplate几乎一直使用ContentControlContentPresenter何时会是更好的select? 为什么?

ContentControl是包含其他元素并具有Content property(例如Button )的控件的基类。

ContentPresenter在控件模板中用于显示内容。

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

编辑:我的经验法则(不适用于所有情况下,使用你的判断):

  1. ControlTemplate内部使用ContentPresenter
  2. ControlTemplate (包括DataTemplate和外部模板)之外,尽量不要使用它们中的任何一个,如果需要,您必须首选ContentPresenter
  3. 子类ContentControl如果您正在创build一个自定义“无形”控制托pipe内容,并且您不能通过更改现有的控件的模板(这应该是非常罕见的)获得相同的结果。

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

ContentControl可以在任何地方使用,不一定在模板中使用。 它将接收为分配给它的内容types定义的任何DataTemplate

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

ContentPresenter vs ContentControl (编辑:断开的链接replace为存档的版本。)

ContentPresenter.ContentSource实际上是两个类之间最大的区别。 ContentSource属性只在ControlTemplate中有意义; 它确定内容应该映射到哪个TemplatedParent属性。 例如,如果一个控件包含一个依赖属性MyProperty1 ,那么我们可以在它的ControlTemplatefind以下内容:

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

ContentPresenter的内容将收到MyProperty1的值。

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

对于那些认识angular色的人来说:这与透射机制类似。

有时候一个例子比理论术语更容易。 在MS网站(滚动到底部: http : //msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter (v= vs.110 ) .aspx ),它使用一个button作为一个例子。 一个Button有一个ContentControl,它允许你放置一个控件或一个自定义控件,可以是一个Image,Text,CheckBox,StackPanel,Grid等等。

现在在Xaml上定制了Button之后,就可以编写了

 <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只允许你input文字。

这是一个古老的问题,但我刚刚完成开发animation瓷砖控制,基于通用应用程序的模板,从旧的电话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 。 如果你不需要一个单独的容器,那么只需使用ControlTemplateControlPresenters来显示内容块,至less这是微软在开发WP7 / 8 SDK时所做的。 ContentControl也可以用来显示内容,但是它既可以作为容器也可以作为演示者。 所以在上面的示例代码中,它的目的是在Container和Presenter中分割。 在dynamic示例中,您可以显示容器(可以有空的背景或者还没有的背景),然后dynamic填充演示者内容。 一个容器有尺寸(宽度,高度等),你把这些属性放在容器控件上,并在其上显示内容。 在示例中,ContentControl决定了演示者的内容。