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

Posted

技术标签:

【中文标题】用户控件库和自定义控件库有啥区别?【英文标题】:What is the difference between a User Control Library and a Custom Control Library?用户控件库和自定义控件库有什么区别? 【发布时间】:2010-10-22 21:41:33 【问题描述】:

我刚刚开始了解 WPF,并希望创建一个可重用的 WPF 控件。

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

我想了解它们之间的区别,并在理想情况下查看一些何时使用其中一种而不是另一种的示例。

【问题讨论】:

不要忘记嵌套内容或更改控件的模板作为选项。您可以通过这种方式对控件进行相当大的更改,而无需编写自定义控件。 正如 MichaC 所说。 WPF 最好的部分是模板化现有控件可以产生巨大的影响。您应该很少需要自定义控件。这与 WinForms 不同,在 WinForms 中,即使是对控件的微小更改也需要新的派生控件。 还是有用的。拥有另一个金徽章。 【参考方案1】:

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

用户控件在技术上是一个普通的内容控件,您可以在代码中的某些部分进行扩展,但通常通过在其中放置其他控件来进行扩展。因此,正如 Kent 提到的,UserControl 是其他控件的集合。这极大地限制了您可以使用用户控件执行的操作。它比完整的自定义控件更易于使用,但更受限制。

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

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

的逻辑树 窗口 自定义按钮

UserControl 会给出一个逻辑树

窗口 自定义按钮用户控件 按钮

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

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

更新

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

【讨论】:

自定义控件可以用来聚合其他控件吗? 那么可换肤/可模板化的问题呢? 不确定您所说的聚合是什么意思。您不能通过聚合其他控件来创建自定义控件。但是,您可以从 Panel 控件(例如 StackPanel、Grid 或 Panel 本身)派生,这样您就可以使用自定义控件实现布局容器(不确定是否可以使用用户控件来实现)。 是的,但是如果您只想聚合其他控件,使用用户控件可能会更容易。根据您想要执行的操作,自定义控件可能真的很难编写,这就是为什么您会选择使用用户控件,即使它只提供部分功能。 如果以正确的方式实现,这两个控件都应该是可换肤/可模板化的。不幸的是,我的 WPF 参考目前在办公室,所以我无法检查实施细节。【参考方案2】:

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

更多信息here。

【讨论】:

这是我发现的链接之一,它没有很好地解释事情:)。我想我缺少的一件事是可皮肤/可模板化的真正含义以及为什么不能使用用户控件来完成。此外,链接帖子的最后一句是“一般来说,自定义控件比用户控件具有更好的灵活性和可重用性”。如果这是真的,那我为什么要创建用户控件?【参考方案3】:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Mikko Rantanen similarly shares their opinion "使用自定义控件和用户控件是如果您可以使用用户控件完成某些操作并且逻辑树中的额外控件元素不会打扰您,请使用用户控件,因为它们更容易创建和维护。”

【讨论】:

以上是关于用户控件库和自定义控件库有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

用户控件、自定义控件和组件有啥区别?

UWP的类库和windows运行时组件有啥区别

推荐用于开发 ASP.NET 用户和自定义控件的书籍 [关闭]

C# .net不同版本中winform控件 dataGrid /DataGrid/DataGridView 有啥区别

第十六天 自定义控件和自定义组合控件

c# 用户自定义控件的问题 winform