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

我只是来了解 WPF 的速度,并希望创建一个可重用的 WPF 控件。

当我查看在 VisualStudio 中创建项目的选项时,我看到“ WPF 用户控件库”和“ WPF 自定义控件库”。我不清楚他们之间有什么不同,我的谷歌搜索没有找到任何合适的解释。

我想了解它们之间的区别,并且在理想情况下看到一些什么时候使用一个而不是另一个的例子。

58546 次浏览

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

更多信息可用 给你

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

从技术上讲,用户控件是一个普通的内容控件,您可以在代码的某些部分进行扩展,但通常是通过在其中放置其他控件来进行扩展。因此,正如 Kent 提到的,UserControl 是其他控件的聚合。这在很大程度上限制了您使用用户控件所能做的事情。它更容易使用,但比完整的自定义控件更受限制。

从运行时的角度来看,这些控件有一些细微的差别。当构建应用程序并将 UserControl 放入其中时,控件树中将包含一个具体的 UserControl 模板。所以如果我们考虑一个蹩脚的例子,一个特殊的按钮。如果您使用的是用户控件,那么您需要在 <UserControl>元素中添加一个按钮。使用自定义控件时,最有可能从按钮派生控件本身。这种差异在逻辑树中是可见的。

而自定义控件将提供类似于

    < li > 视窗
    • 定制按钮

UserControl 将提供一个逻辑树

    < li > 视窗
      < li > CustomButtonUserControl
      • 按钮

所以最终 UserControl 只是一个普通的 ContentControl,您可以对其进行一些扩展,并且可以为其预定义内容。自定义控件提供了更大的灵活性,代价是易于实现,因为您必须在代码中完成所有的逻辑和交互,而不是利用 XAML。

尽管经历了这一切,我并不认为 VisualStudio 模板有太大的不同。最有可能的情况是,VisualStudio 自定义控件仅创建具有空自定义控件的项目,而 User Control 项目是具有空用户控件的项目。以后可以向项目中添加任何类型的项。

更新

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

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

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

此外,正如 Novitchi SCameron Macfarland在单独的文章中解释的那样,自定义控件库还添加了一个 ThemeInfo组装属性来解析控件的默认样式/模板的位置。

用户控件和自定义控件之间的差异

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

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

如果以下所有条件都适用,可以考虑从 UserControl中得出结论:

  • 您希望生成控件的方式与生成应用程序的方式类似。
  • 您的控件仅由现有组件组成。
  • 您不需要支持复杂的定制。

如果以下任何一项适用,考虑从 Control中得出:

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

如果以下任何一项适用,考虑从 FrameworkElement中得出:

  • 您希望对控件的外观进行精确控制,而不仅仅是简单元素组合所提供的控件。
  • 您希望通过定义自己的呈现逻辑来定义控件的外观。

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

Reed Copsey 解释道“ UserControls 意味着将多个 WPF 控件组合在一起,以便在其他控件的基础上构建一套功能”,并进一步分享了他的经验,“对 CustomControls 的需求在 WPF 中实际上是相当罕见的,因为 WPF 模板选项和附加属性允许您使用标准控件做几乎任何事情”。

使用自定义控件和用户控件就是如果你可以用用户控件完成一些事情,并且逻辑树中的额外控件元素不会打扰你,那么就使用用户控件,因为它们更容易创建和维护