我不确定什么时候应该使用ContentPresenter而不是ContentControl(反之亦然)。目前,我一直在datatemplate中使用ContentControl。什么时候ContentPresenter是一个更好的选择?,为什么?
ContentPresenter通常在ControlTemplate中使用,作为一个占位符,表示“将实际内容放在这里”。
ContentControl可以在任何地方使用,不一定是在模板中。它将拾取为分配给它的内容类型定义的任何DataTemplate
ContentControl是包含其他元素并具有content属性(例如Button)的控件的基类。
ContentPresenter用于控件模板内部显示内容。
当直接使用ContentControl时(它应该被用作基类),它有一个使用ContentPresenter来显示其内容的控件模板。
我的经验法则(并非适用于所有情况,请自行判断):
在ControlTemplate内部使用ContentPresenter 在ControlTemplate之外(包括DataTemplate和外部模板)尽量不要使用它们中的任何一个,如果你需要,你必须更喜欢ContentPresenter 如果你正在创建一个承载内容的自定义“无外观”控件,并且你不能通过更改现有控件的模板来获得相同的结果(这种情况应该是极其罕见的),则子类ContentControl。
我最近在我的博客上写了一篇关于这两个控件的文章:
ContentPresenter vs ContentControl
ContentPresenter。ContentSource是这两个类之间最大的区别。 ContentSource属性只在ControlTemplate中有意义;它决定内容应该映射到哪个TemplatedParent属性。 例如,如果一个控件包含一个依赖属性MyProperty1,那么我们可能会在它的ControlTemplate中发现以下内容:
<ControlTemplate TargetType="MyControl" >
[...]
<ContentPresenter ContentSource="MyProperty1" />
[...]
</ControlTemplate>
ContentPresenter的内容将接收MyProperty1的值。
请注意,如果属性的名称是Content,则不需要指定ContentSource,因为它是默认值。
对于那些了解angularJs的人来说:这类似于transclude机制。
有时例子比理论术语更容易。在一个MS网站(滚动到底部:http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter(v=vs.110).aspx)中,它使用一个按钮作为示例。一个按钮有一个ContentControl,它允许你放置一个控件或一个自定义控件,可以是图像、文本、复选框、堆栈面板、网格等等。
在定制了Button之后,现在就可以在Xaml上编写了
<my:Button>
<my:Button.Content>
<my:AnotherControl>
</my:Button.Content>
</my:Button>
在上面的示例代码中,“my:按钮。Content"是ContentControl。AnotherControl将被放置到你指定的ContentPresenter所在的位置。
类似地,当比较TextBox和TextBlock, TextBox有一个内容演示器为您塞东西在它就像上面的按钮的例子,而TextBlock没有。一个TextBlock只允许你输入文本。
这是一个老问题,但我刚刚完成了一个动画平铺控件的开发,模板为一个通用的应用程序,看看这个代码从旧的手机WP7/8 SDK:
<ContentControl x:Name="contentControl" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalAlignment="Stretch" VerticalContentAlignment="Stretch">
<ContentPresenter x:Name="contentPresenter" CacheMode="BitmapCache"/>
</ContentControl>
Here you can see the ContentControl is the Container and the Presenter for displaying content. In most cases the ControlTemplate will be the Container but if you want in your ControlTemplate another container you can put an extra Container: ContentControl in it and for presenting the content a separate ContentPresenter. If you dont need a separate container then just use ControlTemplate and ControlPresenters for displaying content blocks at least thats what the guys at Microsoft did when they developed the WP7/8 SDK. The ContentControl can also be used for displaying content but then it serves both as container and presenter. So in the sample code above its purpose is splitted in Container and Presenter. In dynamic samples you could display the container (it can have an empty background or something thats not there yet) and then dynamically fill it with the presenter content. A container has dimensions (width,height etc.), you put those properties on the container control and present content on it. In the sample the ContentControl determines what has to be done with the presenter content.
推荐文章
- 调用线程必须是STA,因为许多UI组件都要求这一点
- ContentControl和ContentPresenter有什么区别?
- 创建一个完成的任务
- WPF中控制模板和数据模板的区别
- 为什么Func<T,bool>而不是Predicate<T>?
- 我如何能使一个组合框不可编辑的。net ?
- .NET反射的成本有多高?
- 将流转换为字符串并返回
- IEquatable和重写Object.Equals()之间的区别是什么?
- 创建一个堆栈大小为默认值50倍的线程有什么危险?
- 选择Enum类型的默认值而无需更改值
- String与StringBuilder
- 远程主机强制关闭现有连接
- 为什么ReSharper想要使用'var'的一切?
- 如何检查一个对象是否为空?