首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >UserControl和ContentControl有什么区别?

UserControl和ContentControl有什么区别?
EN

Stack Overflow用户
提问于 2013-09-13 08:27:54
回答 6查看 12.7K关注 0票数 21

根据所有的文档,当您创建一个非查找控件时,您应该对UserControl进行子类。然而,UserControlContentControl的一个简单子类,但它似乎并没有向它添加任何东西,在接口方面。因此,您可以使用设计器生成的代码并将基类更改为ContentControl,而且它的工作方式似乎仍然完全相同。

那么UserControlContentControl上有什么意义呢?

更新:

对于那些不断回答Visual的人来说,我认为情况并非如此。试试看!在Visual中创建一个新的UserControl,然后在生成的XAML文件中将根标记更改为ContentControl。然后,在关联的类文件中,将基类更改为ContentControl,或者像我在这里所做的那样简单地删除它(参见注释),您将看到它的工作方式完全相同,包括对WYSIWYG的完整支持。

注意:您可以从代码隐藏中删除基类,因为它实际上是一个部分类,XAML设计器通过代码生成创建了类的另一部分。因此,基类将始终被定义为XAML文件的根元素,因此您可以简单地在代码隐藏中省略它,因为它是多余的。

这是最新的XAML..。

代码语言:javascript
运行
复制
<ContentControl x:Class="Playground.ComboTest.InlineTextEditor"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <TextBlock Text="Success" />

</ContentControl>

...and相关的类文件..。

代码语言:javascript
运行
复制
namespace Playground.ComboTest {

    public partial class InlineTextEditor {

        public InlineTextEditor()
            => InitializeComponent();
    }
}
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-01-18 14:41:47

当您不需要为使用者提供一个UserControls时,ControlTemplate很适合聚合现有的控件。这意味着UserControls不是没有外观的。为什么不直接使用ContentControl,因为它可以像UserControl那样耦合XAML,并且实现看起来类似于UserControl?嗯,有几个重要的技术差异你必须知道:

  1. UserControls将自己设置为由它们中的元素引发的RoutedEvents的源。这意味着当UserControl外部的元素接收到冒泡事件时,源是UserControl,而不是您在UserControl中交互的东西。在您经常听到的关于UserControls的哲学意义上,“它用于聚合现有的控件”,这是有意义的,因为您希望父容器元素将您的UserControl看作一个单元。例如,您的UserControl包含用户单击的按钮,包含UserControl实例的网格接收MouseLeftButtonUp事件,但是button不是事件的源,而是UserControl。
  2. UserControl将可聚焦和IsTabStop设置为false。您可以在这里再次看到这种哲学,因为我们不希望一组现有的控件具有可聚焦性。
  3. UserControl将HorizontalAlignment和VerticalAlignment设置为拉伸。ContentControl将自动设置为“左”和“顶”。
  4. UserControl自己的 AutomationPeer实现 允许您通过 VisualStateManager.GoToState()更改VisualStates。ContentControl要求VisualStateGroups位于顶层,您必须用VisualStateManager.GoToElementState()调用它们。
  5. 用户控件自己的ControlTemplate将内容包装在边框中。在考虑UserControl的哲学用例时,这同样是有意义的。
  6. 用户控件自己的ControlTemplate提供了比ContentControl更多的TemplateBindings。这是对上述一些项目的概述,但解释了它们是如何可能的。回想一下,UserControl提供了一个边框,所以这与下面看到的一些免费TemplateBindings有关。这使得您可以尊重控件上的BorderBrush、BorderThickness、背景和填充属性,否则这些属性只会使用ContentControl。例如,如果您只是从ContentControl派生您的控件并在根ContentControl元素上设置背景属性,它将无法工作,因为ControlTemplate of ContentControl没有用于背景的TemplateBinding。当然,您可以在包装所需元素的子内容元素上设置背景属性,如Grid,但这并不理想。

内容控制的ControlTemplate

代码语言:javascript
运行
复制
<ControlTemplate TargetType="ContentControl">
  <ContentPresenter
   Content="{TemplateBinding ContentControl.Content}"
   ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}"
   ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}" />
</ControlTemplate>

用户控件的ControlTemplate

代码语言:javascript
运行
复制
<ControlTemplate TargetType="UserControl">
  <Border BorderBrush="{TemplateBinding Border.BorderBrush}"
   BorderThickness="{TemplateBinding Border.BorderThickness}"
   Background="{TemplateBinding Panel.Background}"
   Padding="{TemplateBinding Control.Padding}"
   SnapToDevicePixels="True">
    <ContentPresenter
     HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}"
     VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}"
     SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}"
     ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}"
     ContentStringFormat="{TemplateBinding ContentControl.ContentStringFormat}"
     Content="{TemplateBinding ContentControl.Content}" />
  </Border>
</ControlTemplate>
票数 38
EN

Stack Overflow用户

发布于 2013-09-13 08:39:49

基本上,UserControl类是为了方便而存在的。它使我们能够从已经存在的控件构建UI的小部分,而ContentControl实际上是用来创建新控件的,通常只有一个用途和/或功能。

我读了一本对此有很好解释的书,幸运的是,有人把它放在了网上。从链接的书中:

UserControl类是一个容器类,充当相关控件集合的“黑匣子”容器。如果您需要一个由三个控件组成的集合来始终显示在一起,并且允许彼此轻松地交谈,那么可能会出现的一个候选控件是UserControl类。

然后与是否创建CustomControl有关

以下是决定过程的摘要: 尽可能多地使用框架。WPF提供了各种可扩展控件,因此请确保您想要的功能在WPF控件中不存在。 在许多情况下,您所使用的数据结构需要不同的可视化表示。使用ControlTemplates和DataTemplates通常可以获得所需的功能。 看看ValueConverters,看看它们是否能帮助弥合股票功能和您需要的之间的差距。 最后,查看是否无法使用附加属性扩展现有行为。

看看你的问题有一个深入的答案:

WPF控制开发释放

更新>>>

@MarqueIV,更直接地回答您的问题:为了方便起见,我们提供了UserControl类。就这样。如果将WPF CustomControl添加到您的项目中,您将看到它没有XAML文件。这意味着您必须在Generic.xaml文件夹中的一个名为Themes的文件中设计控制标记。UserControl类为我们提供一个XAML文件,以便更容易地创建它们.所以更方便..。就这样。这就是原因。

票数 9
EN

Stack Overflow用户

发布于 2013-09-13 09:05:54

ContentControl不同的是,UserControl重写了OnCreateAutomationPeer方法,您可能会查找它。也许它有一些不同于ContentControl的UI行为。

此方法创建一个-instance

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18781679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档