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


168

我只是想加快WPF的速度,并想创建一个可重用的WPF控件。

当我查看在Visual Studio中创建项目的选项时,看到“ WPF用户控件库”和“ WPF自定义控件库”。我不清楚它们之间有什么区别,而且我的Google搜索结果还没有任何合理的解释。

我想了解它们之间的区别,并且理想情况下会看到一些何时使用另一个的示例。


2
不要忘记嵌套内容或更改控件模板作为选项。您可以通过这种方式对控件进行重大更改,而无需编写自定义控件。
MichaC

正如MichaC所说的。WPF最好的部分是,对现有控件进行模板化可以产生巨大的影响。您应该很少需要自定义控件。这与WinForms不同,在WinForms中,即使对控件进行很小的更改也需要一个新的派生控件。
Mikko Rantanen

仍然有用。还有另一个金牌。
ouflak '16

Answers:


117

在实践中,自定义控件是在代码级别上实现的,而您可以将XAML用作用户控件。自定义控件扩展了WPF控件基类之一,并通过代码提供了附加功能,因此所有添加的逻辑和表示形式都必须在代码内部实现。

从技术上讲,用户控件是普通的内容控件,您可以在代码中的某些部分进行扩展,但是通常可以通过在其中放置其他控件来对其进行扩展。因此,正如肯特(Kent)所述,UserControl是其他控件的集合。这大大限制了您可以使用用户控件执行的操作。与完全自定义控件相比,它更易于使用,但局限性更大。

从运行时的角度来看,这些控件之间的差异很小。在构建应用程序并将UserControl放入其中时,控件树将在其中包含一个具体的UserControl模板。因此,如果我们考虑一个专门按钮的me脚例子。如果您使用的是用户控件,则可以在<UserControl>元素内添加一个按钮。使用自定义控件时,最有可能从按钮派生控件本身。差异将在逻辑树中可见。

尽管自定义控件将提供类似于

  • 窗口
    • 自定义按钮

UserControl会给出一个逻辑树

  • 窗口
    • CustomButtonUserControl
      • 纽扣

因此,最后,UserControl只是一个普通的ContentControl,您可以对其进行扩展,并可以为其预定义内容。自定义控件以易于实现为代价提供了更大的灵活性,因为您必须执行代码中的所有逻辑和交互操作,而不是从XAML中受益。

尽管毕竟,我认为Visual Studio模板没有太大区别。Visual Studio自定义控件很可能只创建一个具有空自定义控件的项目,而User Control项目是一个具有空用户控件的项目。您以后可以将任何种类的项目添加到项目中。

更新资料

我对何时使用自定义控件和用户控件的看法是,如果您可以使用用户控件完成某些操作,而逻辑树中的多余控件元素不会打扰您,请使用用户控件,因为它们非常容易创建和维护。仅在有理由不使用用户控件时才使用自定义控件。


2
可以使用自定义控件来聚合其他控件吗?

皮肤/模板问题又如何呢?

1
不知道您说的是什么意思。您不能通过聚合其他控件来创建自定义控件。但是,您可以从Panel控件(例如StackPanel,Grid或Panel本身)派生,因此可以使用自定义控件来实现布局容器(不确定是否可以使用用户控件来实现)。
Mikko Rantanen

是的,但是如果您只想汇总其他控件,则使用用户控件可能会容易得多。根据您要执行的操作,很难编写自定义控件,这就是为什么您选择使用用户控件的原因,尽管该控件仅提供部分功能。
2009年

1
当以正确的方式实现时,这两个控件都应该是可换肤的/可模板化的。不幸的是,我的WPF参考目前在办公室,所以我无法检查实施细节。
Mikko Rantanen

23

A Control表示可表皮化(可模板化)的某些行为,而a UserControl通常Control是特定于应用程序的s 的高层聚合。

更多信息请点击这里


3
那是我发现并不能很好地解释问题的链接之一:)。我想我缺少的一件事是可换肤/可模板化的真正含义,以及为什么不能通过用户控件来完成。另外,链接文章的最后一句话是“一般而言,自定义控件比用户控件具有更好的灵活性和可重用性”。如果是这样,那我为什么还要创建一个用户控件?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.