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

Wpf 用户控件库和自定义控件库之间有什么区别?,wpf,user-controls,custom-controls,Wpf,User Controls,Custom Controls,我刚刚开始了解WPF,并希望创建一个可重用的WPF控件 当我在VisualStudio中查看创建项目的选项时,我会看到“WPF用户控件库”和“WPF自定义控件库”。我不清楚它们之间有什么区别,我的谷歌搜索也没有找到任何像样的解释 我想了解它们之间的差异,并在理想情况下查看一些何时使用它们的示例。A控件表示一些可蒙皮(可模板化)的行为,而A用户控件通常是特定于应用程序的控件的高级聚合 更多信息可用。实际上,自定义控件是在代码级别实现的,而用户控件可以使用XAML。自定义控件扩展了一个WPF控件基类

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

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


我想了解它们之间的差异,并在理想情况下查看一些何时使用它们的示例。

A
控件
表示一些可蒙皮(可模板化)的行为,而A
用户控件
通常是特定于应用程序的
控件
的高级聚合


更多信息可用。

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

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

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

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

  • 窗口
    • 自定义按钮
UserControl将给出一个逻辑树

  • 窗口
    • 自定义按钮控制
      • 钮扣
因此,最终用户控件只是一个普通的ContentControl,您可以对其进行一些扩展,并预定义其内容。自定义控件以易于实现为代价提供了更大的灵活性,因为您必须在代码中执行所有逻辑和交互,而不是使用XAML

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

更新


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

这是我发现的一个没有很好解释的链接:)。我想我缺少的一件事是skinnable/Templateable的真正含义,以及为什么不能用用户控件实现它。此外,链接文章的最后一句话是“一般来说&简单地说,自定义控件比用户控件具有更好的灵活性和可重用性”。如果这是真的,那么我为什么要创建一个用户控件?自定义控件可以用来聚合其他控件吗?可蒙皮/可模板化问题呢?不确定聚合是什么意思。不能通过聚合其他控件来创建自定义控件。但是,您可以从面板控件(如StackPanel、Grid或Panel本身)派生,以便使用自定义控件实现布局容器(不确定是否可以使用用户控件实现)。是的,但如果您只想聚合其他控件,则使用用户控件可能更容易。根据您想要执行的操作,自定义控件可能很难编写,这就是为什么您会选择使用用户控件,即使它只提供功能的子集。当以正确的方式实现时,这两个控件都应该是可蒙皮/模板化的。不幸的是,我的WPF引用目前在办公室,因此我无法检查实现细节。不要忘记嵌套内容或更改控件的模板作为选项。你可以用这种方式对控件进行非常显著的更改,而不必编写自定义控件。正如MichaC所说的。WPF最好的部分是模板化现有控件可以产生巨大的影响。您应该很少需要自定义控件。这与WinForms不同,在WinForms中,即使对控件进行微小更改,也需要一个新的派生控件。仍然很有用。再要一枚金徽章。