.net ContentControl和ContentPresenter有什么区别?

sq1bmfud  于 2023-05-23  发布在  .NET
关注(0)|答案(6)|浏览(347)

我不确定什么时候应该使用ContentPresenter而不是ContentControl(反之亦然)。目前,我在我的DataTemplate中几乎一直使用ContentControl。什么时候ContentPresenter会是更好的选择?为什么呢

8dtrkrch

8dtrkrch1#

ContentControl是包含其他元素并具有Content-属性(例如,Button)的控件的基类。
ContentPresenter在控件模板中用于显示内容。
ContentControl,当直接使用时(它应该被用作基类),有一个使用ContentPresenter显示其内容的控件模板。
我的经验法则(并不适用于所有情况,请使用您的判断):

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

bjg7j2ky2#

ContentPresenter通常在ControlTemplate中使用,作为占位符,表示“将实际内容放在这里”。
ContentControl可以在任何地方使用,不一定要在模板中使用。它将拾取为分配给它的内容类型定义的任何DataTemplate

xmjla07d

xmjla07d3#

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

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

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

ContentPresenter的内容将接收MyProperty1的值。
请注意,如果属性的名称是Content,则不需要指定ContentSource,因为它是默认值。
对于那些了解angularJs的人:这类似于转换机制。

8yparm6h

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。如果你不需要一个单独的容器,那么只需要使用ControlTemplateControlPresenters来显示内容块,至少这是微软在开发WP7/8 SDK时所做的。ContentControl也可以用于显示内容,但它同时充当容器和表示器。因此,在上面的示例代码中,它的用途被拆分为Container和Presenter。在动态示例中,您可以显示容器(它可以有一个空的背景或一些还没有的东西),然后动态地用演示者内容填充它。容器有尺寸(宽度,高度等),你把这些属性放在容器控件上,并在上面显示内容。在示例中,ContentControl确定必须对演示者内容执行的操作。

ilmyapht

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只允许您输入文本。

pxq42qpu

pxq42qpu6#

ContentControl是做一个WPF自定义控件(不要和用户控件混淆)。所以这是你的顶级课程。ContentPresenter就像任何其他“常规”控件一样。您可以在自定义控件、用户控件、模板或仅在标记中使用它

相关问题