64

我一直在阅读有关用户控件和自定义控件之间区别的一些解释,例如: http: //www.wpftutorial.net/CustomVsUserControl.html

例如,我想创建一个具有 2 个组合框的数据网格的简单组合,这些组合框负责更改数据网格项目的值。我想为此创建一个特定的控件,因为我将多次使用它。我想实现背后的逻辑,然后在 xaml 调用中我只需要指定 itemsSource。

对于这个例子,我应该创建一个用户还是自定义控件?既然我会有属性和逻辑,我应该有这个控件的视图模型吗?

编辑:你知道一些文章在这两个选项之间有明确的概念分离吗?

4

7 回答 7

101

不仅在用户控件和自定义控件之间进行选择,而且在用户控件、自定义控件、自定义控件模板、自定义数据模板、标题模板(用于基于集合的控件)、附加属性之间进行选择。请参阅控制创作概述

我按照考虑的顺序去

  1. 附加属性:如果可以实现功能,我使用附加属性。例如,数字文本框。

  2. 控制模板:当可以通过自定义控制模板来满足需求时,我使用它。例如,圆形进度条。

  3. 自定义控件:如果控件模板做不到,我使用自定义控件。前提是我需要自定义/扩展已经存在的控件。示例提供基于 GridView 中标题行的排序、过滤(GridView 存在于 Metro 应用程序中,仅用于说明示例)

  4. 用户控制:最不喜欢的一个。仅当需要合成时,我无法使用自定义控件来完成。就像在您的示例中一样,2 个组合框和 1 个数据网格。用户控件不提供可以通过自定义控件或控件模板利用的无缝外观功能。

于 2012-06-28T15:55:45.910 回答
50

您已经有了一些很好的答案来解释差异,但也了解自定义控件并UserControls具有不同的目的:

AUserControl通常封装了某种复合行为。例如,如果您的应用程序需要在许多地方编辑联系人详细信息,您可以创建一个自定义控件,该控件具有所有数据的标签和文本字段,并使用具有相关代码的提交按钮并重用此控件在整个应用程序中。

自定义控件是从WPF控件类(EG等)之一派生的控件ControlContentControl并且必须在代码中创建。这些控制通常有一个统一的目的(想想、、、TextBoxComboBoxLabel而不是作为一个整体一起行动(尽管不一定是这样)。

UserControl's 通常对于不熟悉的人来说更容易,WPF因为它们可以在视觉上进行设计。

我的建议是从UserControl. 随着您对工作方式越来越熟悉,您可以随时将其重构为自定义控件WPF。将控件创建为自定义控件需要了解ControlTemplates 和Styles,因为您需要提供自己的知识来定义控件的外观。

说完所有,只要控件运行正确,您使用哪种方法都没有关系。

有关同一问题的两种方法的示例,请参见这篇文章。帖子作者想要一个可以在主要内容前面呈现模态内容的控件。帖子作者实际上通过将其实现为UserControl. 我在帖子中添加了一个答案,该帖子将控件创建为自定义控件,但两者都具有相同的最终效果。

于 2012-06-28T17:40:58.103 回答
7

最好的解释在msdn中。CustomControl 更像是一个“虚拟”名称,在 WPF 中没有名为“CustomControl”的类,而是意味着在 WPF 控件类之一之上创建一个新类,例如ControlItemsControl甚至更具体的控件,例如TextBoxor Button

对于您的特定情况, UserControl 应该就足够了,创建 CustomControl 是可以轻松避免的。虽然这不是一件坏事,但很多人,尤其是来自 WinForms 的 WPF 初学者往往会在必要时进行子类化。

于 2012-06-28T15:53:05.217 回答
7
  • 如果您有一个视图模型,并且希望为它创建一个视图,请使用User-Control

  • 如果您需要一个没有特定视图模型的自治
    控件, 您可能需要一个custom-control

  • 如果您发现您需要的功能作为整体,已经存在于其他控件中,您需要覆盖现有的控件模板
    (即:对于菱形按钮 - 您需要覆盖按钮控件模板。)

  • 关于附加属性和附加行为,当您有一个想要扩展更多属性的控件或者您希望它的行为与其默认行为略有不同时,这些非常有用。

在所提供的 OP 描述的组合情况下,可以使用用户控件或自定义控件来实现。我更喜欢自定义控件,因为没有提供特定的视图模型,“输入”只是绑定到项目集合的属性。

哦,还有,抱歉有点迟到了。

于 2017-02-08T17:24:04.000 回答
1

如果这是您第一次构建控件,我推荐 UserControl,因为 VS 可以让您更轻松地设计其界面。自定义控件更强大,但您必须清楚地将控件的逻辑与其界面分开,这需要更多的准备工作。

于 2012-06-28T15:38:09.847 回答
1

您可以轻松地进行视觉设计CustomControl。创建新的UserControl(或窗口)。在 Designer 中直观地创建其 xaml 结构。将生成的 xaml 的正文复制粘贴到ControlTemplate新的CustomControl(例如,在通用主题文件中)。

如果我没记错的话,您还可以直接在 Blend 中直观地设计 CustomControl 模板。

当然,您也可以在 Window 中实例化 wip CustomControl,并将 Window 的 Designer 视图作为新面板放在 VisualStudio 中控件的 xaml 视图上方。样式模板中的一些 xaml 绑定不会像这样在 Designer 中显示,直到我重建。

[恕我直言 GUI 主要是视觉问题,不应该也不需要在代码中创建。]

于 2013-11-06T22:21:07.977 回答
-2

好吧,要创建自定义控件,您需要将其实现为用户控件。您自己的用户控件称为自定义控件。这很简单。

UserControl 是包含自定义内容的基类:

<UserControl>
  Your custom WPF content
</UserControl>

我不完全同意这篇文章。但是,在您的情况下,您需要一个可以在 UI 中重新使用的 UserControl。

于 2012-06-28T15:18:44.113 回答