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

17 *_* 26 161 wpf user-controls custom-controls

我刚刚开始加速WPF,并希望创建一个可重用的WPF控件.

当我查看在Visual Studio中创建项目的选项时,我看到"WPF用户控件库"和"WPF自定义控件库".我不清楚他们之间的区别是什么,我的谷歌搜索没有找到任何体面的解释.

我想了解它们之间的差异,理想情况下看一些何时使用一个而不是另一个的例子.

Mik*_*nen 112

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

用户控件在技术上是一种普通的内容控件,您可以在代码的某些部分进行扩展,但通常通过在其中放置其他控件来扩展它.因此Kent提到UserControl是其他控件的聚合.这极大地限制了用户控件的功能.它比使用完全自定义控件更容易使用但更有限.

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

而自定义控件将提供类似于的逻辑树

  • 窗口
    • 的CustomButton

UserControl将给出一个逻辑树

  • 窗口
    • CustomButtonUserControl
      • 按键

所以最后UserControl只是一个普通的ContentControl,你可以扩展一下,你可以预定义内容.自定义控件以易于实现的代价提供更大的灵活性,因为您必须在代码中执行所有逻辑和交互,而不是获得XAML的好处.

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

更新

我对何时使用自定义控件和用户控件的看法是,如果您可以使用用户控件完成某些操作并且逻辑树中的额外控件元素不会打扰您,请使用用户控件,因为它们更容易创造和维护.仅在您有理由不使用用户控件时才使用自定义控件.

  • 可以使用自定义控件来聚合其他控件吗? (2认同)

Ken*_*art 23

A Control表示一些可换肤(可模板化)的行为,而a UserControl通常Control是特定于应用程序的更高级别的s 聚合.

这里有更多信息.

  • 这是我发现的链接之一,没有解释得很好:).我想我遗漏的一件事是skinnable/templatable真正意味着什么以及为什么用户控件无法做到这一点.此外,链接帖子的最后一句是"一般而言,自定义控件具有比用户控件更好的灵活性和可重用性".如果这是真的,那么为什么我要创建一个用户控件呢? (3认同)

cdi*_*ins 9

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

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

此外,正如Novitchi SCameron Macfarland在单独的帖子中所解释的,自定义控件库还添加了一个ThemeInfo程序集属性来解析控件的默认样式/模板的位置。

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

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

这篇 MSDN 文章就何时在开发用户控件、自定义控件或从框架元素派生之间进行选择提出了以下建议。

如果满足UserControl以下所有条件,请考虑派生:

  • 您希望以类似于构建应用程序的方式构建控件。
  • 您的控件仅包含现有组件。
  • 您不需要支持复杂的定制。

Control如果满足以下任一条件,请考虑派生:

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

FrameworkElement如果满足以下任一条件,请考虑派生:

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

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

Reed Copsey 解释说“UserControls 旨在将多个 WPF 控件组合在一起,以便从其他控件构建一组功能”,并进一步分享他的经验,“在 WPF 中实际上很少需要 CustomControls,因为WPF 模板选项和附加属性允许您使用标准控件执行几乎任何操作”。

Mikko Rantanen 同样同意他们的观点“使用自定义控件和用户控件是,如果您可以使用用户控件完成某些操作,并且逻辑树中的额外控制元素不会打扰您,请使用用户控件,因为它们要容易得多去创造和维护。”