用户控件库和自定义控件库有什么区别?

199
我刚开始学习WPF,并希望创建一个可重用的WPF控件。 当我查看在Visual Studio中创建项目的选项时,我看到“WPF用户控件库”和“WPF自定义控件库”。对我来说不清楚它们之间的区别,我的谷歌搜索没有找到任何合适的解释。 我想了解它们之间的区别,最好能看到一些何时使用其中一个而不是另一个的示例。

2
不要忘记嵌套内容或更改控件的模板作为选项。通过这种方式,您可以对控件进行相当大的更改,而无需编写自定义控件。 - MichaC
就像MichaC所说的那样。WPF最好的部分是模板化现有控件可以产生巨大的影响。你应该很少需要自定义控件。这与WinForms不同,即使对控件进行微小的更改也需要一个新的派生控件。 - Mikko Rantanen
仍然有用。获得了另一个金徽章。 - ouflak
3个回答

132
实际上,自定义控件是在代码级别实现的内容,而用户控件可以使用XAML。自定义控件扩展了WPF控件基类之一,并通过代码提供额外的功能,因此所有添加的逻辑和表示必须在代码中实现。
用户控件从技术上讲是普通内容控件,您可以在代码的某些部分对其进行扩展,但通常是通过将其他控件放置在其中来扩展。所以像Kent所说,UserControl是其他控件的聚合体。这严格限制了您可以使用用户控件做什么。它更易于使用,但比完全自定义控件的功能要受到更多限制。
从运行时角度来看,这些控件有一些小差异。当构建应用程序并将UserControl放入其中时,控件树将具有具体的UserControl模板。因此,如果我们考虑一个专门的按钮的简单示例,如果您使用用户控件,则需要在<UserControl>元素中添加一个按钮。如果使用自定义控件,则可能会从按钮派生出控件本身。这两者的区别在逻辑树中将会体现出来。
自定义控件提供的逻辑树类似于:
  • 窗口
    • 自定义按钮
而用户控件的逻辑树如下:
  • 窗口
    • CustomButtonUserControl
      • 按钮
因此,最终说UserControl只是一个可以稍微扩展并预定义内容的普通ContentControl。自定义控件提供了更大的灵活性,但代价是实现难度更大,因为您必须在代码中处理所有逻辑和交互,而无法享受XAML的好处。
但是,经过这么多讲解之后,我认为在Visual Studio模板中并没有太大的区别。很可能Visual Studio自定义控件只是创建了一个空的自定义控件项目,而用户控件项目则是创建了一个空的用户控件项目。您以后可以向项目中添加任何类型的项目。

关于何时使用自定义控件和用户控件,我的观点是,如果你可以用用户控件完成某些功能,且逻辑树中的额外控件元素不会影响你,那么就使用用户控件,因为它们更容易创建和维护。只有在有理由不使用用户控件时,才使用自定义控件。


2
一个自定义控件可以用来聚合其他控件吗? - 17 of 26
那可皮肤化/模板化问题怎么样了? - 17 of 26
1
不确定您所说的“聚合”是什么意思。您不能通过聚合其他控件来创建自定义控件。但是,您可以从面板控件(例如StackPanel、Grid或Panel本身)派生,以便使用自定义控件实现布局容器(不确定是否可以在用户控件中这样做)。 - Mikko Rantanen
1
这两个控件在正确实现时应该支持皮肤/模板。不幸的是,我的WPF参考资料目前在办公室,无法查看实现细节。 - Mikko Rantanen
我不得不给它一个踩,因为与肯特对这样一个基本问题的回答相比,信噪比非常低。 - yzorg
显示剩余2条评论

25

Control表示可被定制主题的某些行为,而UserControl通常是应用程序特定的一组高级Controls

更多信息请点击这里


3
这是我找到的一条链接,对事情的解释不是很清楚:)。 我猜我缺少的一个东西是皮肤/模板的真正含义以及为什么不能使用用户控件来实现它。还有,链接帖子的最后一句话是“一般而言,自定义控件具有比用户控件更好的灵活性和可重用性”。 如果这是真的,那么为什么我会想创建一个用户控件呢? - 17 of 26

7

用户控件库、自定义控件库和WPF类库模板的区别

要回答原问题,两个库模板的主要区别在于一个带有默认的空用户控件,而另一个带有默认的空自定义控件。它们都是WPF类库。任何一个项目都可以包含零个或多个用户控件和零个或多个自定义控件。

此外,正如Novitchi SCameron Macfarland分别解释的那样,自定义控件库还添加了ThemeInfo程序集属性,以解决控件的默认样式/模板的位置。

用户控件和自定义控件的区别

用户控件是WPF控件的聚合(包括其他用户控件),而自定义控件是从Control派生的类。

这篇MSDN文章提出了以下关于何时选择开发用户控件、自定义控件或派生自框架元素的建议。

如果以下所有条件都适用,请考虑从UserControl派生:

  • 您想要像构建应用程序一样构建控件。
  • 您的控件仅包含现有组件。
  • 您不需要支持复杂的自定义。

如果以下任何条件适用,请考虑从Control派生:

  • 您希望通过ControlTemplate自定义控件的外观。
  • 您希望您的控件支持不同的主题。

如果以下任何条件适用,请考虑从FrameworkElement派生:

  • 您希望对控件的外观具有精确的控制能力,超出了简单元素组合提供的范围。
  • 您希望通过定义自己的渲染逻辑来定义控件的外观。

其他来自StackOverflow答案的好建议:

Reed Copsey解释说,“用户控件旨在将多个WPF控件组合在一起,以构建由其他控件构建的功能集”,并进一步分享他的经验称,“在WPF中,自定义控件的需要实际上相当少,因为WPF模板选项和附加属性允许您使用标准控件完成几乎任何事情。”

Mikko Rantanen 同样分享了他们的观点:"如果你可以使用用户控件完成某个任务且逻辑树中多余的控件不会影响到你,那么请使用用户控件,因为它们更容易创建和维护。"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接