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