我不确定什么时候应该使用ContentPresenter而不是ContentControl(反之亦然)。目前,我在我的DataTemplate中几乎一直使用ContentControl。什么时候ContentPresenter会是更好的选择?为什么呢
ContentPresenter
ContentControl
DataTemplate
8dtrkrch1#
ContentControl是包含其他元素并具有Content-属性(例如,Button)的控件的基类。ContentPresenter在控件模板中用于显示内容。ContentControl,当直接使用时(它应该被用作基类),有一个使用ContentPresenter显示其内容的控件模板。我的经验法则(并不适用于所有情况,请使用您的判断):
Content
Button
ControlTemplate
bjg7j2ky2#
ContentPresenter通常在ControlTemplate中使用,作为占位符,表示“将实际内容放在这里”。ContentControl可以在任何地方使用,不一定要在模板中使用。它将拾取为分配给它的内容类型定义的任何DataTemplate
xmjla07d3#
我最近在我的博客上写了一篇关于这两个控件的文章:ContentPresenter vs ContentControl
ContentPresenter.ContentSource实际上是两个类之间最大的区别。ContentSource属性仅在ControlTemplate中有意义;它确定内容应Map到哪个TemplatedParent属性。例如,如果一个控件包含一个依赖属性MyProperty1,那么我们可能会在它的ControlTemplate中找到以下内容:
MyProperty1
<ControlTemplate TargetType="MyControl" > [...] <ContentPresenter ContentSource="MyProperty1" /> [...] </ControlTemplate>
ContentPresenter的内容将接收MyProperty1的值。请注意,如果属性的名称是Content,则不需要指定ContentSource,因为它是默认值。对于那些了解angularJs的人:这类似于转换机制。
ContentSource
8yparm6h4#
这是一个老问题,但我刚刚完成开发一个动画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是用于显示内容的容器和Presenter。在大多数情况下,ControlTemplate将是Container,但如果您希望在ControlTemplate中添加另一个容器,则可以添加额外的Container:ContentControl,并且用于呈现单独的ContentPresenter。如果你不需要一个单独的容器,那么只需要使用ControlTemplate和ControlPresenters来显示内容块,至少这是微软在开发WP7/8 SDK时所做的。ContentControl也可以用于显示内容,但它同时充当容器和表示器。因此,在上面的示例代码中,它的用途被拆分为Container和Presenter。在动态示例中,您可以显示容器(它可以有一个空的背景或一些还没有的东西),然后动态地用演示者内容填充它。容器有尺寸(宽度,高度等),你把这些属性放在容器控件上,并在上面显示内容。在示例中,ContentControl确定必须对演示者内容执行的操作。
ControlPresenters
ilmyapht5#
有时一个例子比理论术语更容易。在MS网站中(滚动到底部:http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter(v=vs.110).aspx),它使用按钮作为示例。一个Button有一个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只允许您输入文本。
pxq42qpu6#
ContentControl是做一个WPF自定义控件(不要和用户控件混淆)。所以这是你的顶级课程。ContentPresenter就像任何其他“常规”控件一样。您可以在自定义控件、用户控件、模板或仅在标记中使用它
6条答案
按热度按时间8dtrkrch1#
ContentControl
是包含其他元素并具有Content
-属性(例如,Button
)的控件的基类。ContentPresenter
在控件模板中用于显示内容。ContentControl
,当直接使用时(它应该被用作基类),有一个使用ContentPresenter显示其内容的控件模板。我的经验法则(并不适用于所有情况,请使用您的判断):
ControlTemplate
内部使用ContentPresenter
ControlTemplate
之外的(包括DataTemplate
和外部模板)尽量不要使用其中的任何一个,如果需要,必须首选ContentPresenter
1.子类
ContentControl
,如果你正在创建一个自定义的“无外观”控件,并且你不能通过改变现有控件的模板来获得相同的结果(这应该是非常罕见的)。bjg7j2ky2#
ContentPresenter通常在ControlTemplate中使用,作为占位符,表示“将实际内容放在这里”。
ContentControl可以在任何地方使用,不一定要在模板中使用。它将拾取为分配给它的内容类型定义的任何DataTemplate
xmjla07d3#
我最近在我的博客上写了一篇关于这两个控件的文章:
ContentPresenter vs ContentControl
ContentPresenter.ContentSource实际上是两个类之间最大的区别。ContentSource属性仅在ControlTemplate中有意义;它确定内容应Map到哪个TemplatedParent属性。例如,如果一个控件包含一个依赖属性
MyProperty1
,那么我们可能会在它的ControlTemplate
中找到以下内容:ContentPresenter的内容将接收
MyProperty1
的值。请注意,如果属性的名称是
Content
,则不需要指定ContentSource
,因为它是默认值。对于那些了解angularJs的人:这类似于转换机制。
8yparm6h4#
这是一个老问题,但我刚刚完成开发一个动画Tile Control,基于通用应用程序的模板,看看旧Phone WP7/8 SDK的代码:
在这里,您可以看到ContentControl是用于显示内容的容器和Presenter。在大多数情况下,ControlTemplate将是Container,但如果您希望在
ControlTemplate
中添加另一个容器,则可以添加额外的Container:ContentControl
,并且用于呈现单独的ContentPresenter
。如果你不需要一个单独的容器,那么只需要使用ControlTemplate
和ControlPresenters
来显示内容块,至少这是微软在开发WP7/8 SDK时所做的。ContentControl也可以用于显示内容,但它同时充当容器和表示器。因此,在上面的示例代码中,它的用途被拆分为Container和Presenter。在动态示例中,您可以显示容器(它可以有一个空的背景或一些还没有的东西),然后动态地用演示者内容填充它。容器有尺寸(宽度,高度等),你把这些属性放在容器控件上,并在上面显示内容。在示例中,ContentControl确定必须对演示者内容执行的操作。ilmyapht5#
有时一个例子比理论术语更容易。在MS网站中(滚动到底部:http://msdn.microsoft.com/en-us/library/system.windows.controls.contentpresenter(v=vs.110).aspx),它使用按钮作为示例。一个Button有一个ContentControl,它允许你放置一个控件或一个自定义控件,可以是Image,Text,CheckBox,StackPanel,Grid,等等。
在定制Button之后,现在在Xaml上,您可以编写
在上面的示例代码中,“my:Button.Content”是ContentControl。AnotherControl将放置到您指定的ContentPresenter所在的位置。
类似地,当比较TextBox和TextBlock时,TextBox有一个ContentPresenter供您在其中填充内容,就像上面的Button示例一样,而TextBlock没有。TextBlock只允许您输入文本。
pxq42qpu6#
ContentControl
是做一个WPF自定义控件(不要和用户控件混淆)。所以这是你的顶级课程。ContentPresenter
就像任何其他“常规”控件一样。您可以在自定义控件、用户控件、模板或仅在标记中使用它