Answers:
ContentControl
是包含其他元素并具有Content
-property(例如Button
)的控件的基类。
ContentPresenter
用于控件模板内部以显示内容。
ContentControl
直接使用(应该用作基类)时,具有一个使用ContentPresenter来显示其内容的控件模板。
我的经验法则(并非在所有情况下都适用,请根据您的判断):
ControlTemplate
使用ContentPresenter
ControlTemplate
(包括DataTemplate
外部模板)中,尽量不要使用其中的任何一个,如果需要,您必须更喜欢ContentPresenter
ContentControl
如果要创建一个托管内容的自定义“无外观”控件,则为子类,而通过更改现有控件的模板(这非常少),您将无法获得相同的结果。ContentPresenter通常在ControlTemplate中使用,用作占位符,表示“将实际内容放在此处”。
ContentControl可以在任何地方使用,而不必在模板中使用。它将拾取为分配给它的内容类型定义的任何DataTemplate
我最近在自己的博客上针对这两个控件写了一篇文章:
ContentPresenter与ContentControl(编辑:断开的链接已替换为存档版本。)
实际上,ContentPresenter.ContentSource是两个类之间最大的区别。ContentSource属性仅在ControlTemplate中才有意义;它确定内容应映射到哪个TemplatedParent属性。例如,如果控件包含依赖项属性MyProperty1
,那么我们可能会在其内部找到以下内容ControlTemplate
:
<ControlTemplate TargetType="MyControl" >
[...]
<ContentPresenter ContentSource="MyProperty1" />
[...]
</ControlTemplate>
ContentPresenter的内容将接收的值MyProperty1
。
请注意,如果属性名称为Content
,则无需指定,ContentSource
因为它是默认值。
对于那些知道angularJs的人:这类似于排除机械师。
这是一个古老的问题,但是我刚刚完成开发一个动画Tile Control,这是一个基于通用应用程序的模板,请查看旧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 ContentControl
:,并在其中单独显示内容ContentPresenter
。如果您不需要单独的容器,则只需使用ControlTemplate
和ControlPresenters
用于显示内容块至少是Microsoft的家伙在开发WP7 / 8 SDK时所做的。ContentControl也可以用于显示内容,但随后既用作容器又用作演示者。因此,在上面的示例代码中,其目的在Container和Presenter中进行了划分。在动态示例中,您可以显示容器(它可以有一个空的背景或还没有的背景),然后用演示者内容动态地填充它。容器具有尺寸(宽度,高度等),您可以将这些属性放在容器控件上并在其上显示内容。在示例中,ContentControl确定必须对演示者内容执行的操作。
有时一个例子比理论上的术语容易。在MS网站(滚动到底部:http : //msdn.microsoft.com/zh-cn/library/system.windows.controls.contentpresenter (v= vs.110 ) .aspx)中,它使用按钮作为一个例子。按钮具有ContentControl,可让您放置一个控件或自定义控件,该控件可以是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具有ContentPresenter供您在其中填充内容,就像上面的Button示例一样,而TextBlock则没有。TextBlock仅允许您输入文本。
Button
不具有一个[ ContentControl
](msdn.microsoft.com/en-us/library/system.windows.controls.contentcontrol(V = vs.110)的.aspx),它是一个(继承)ContentControl
。该Button
有一个ContentPresenter
。请注意,您可以使用standard来做到这一点Button
,而无需对其进行自定义。
ContentPresenter
a ContentControl
来很好地用于ControlTemplate
显示的内容Button
。因此,它不能回答问题。