我一直在阅读一些关于用户控件和自定义控件之间区别的解释,例如:http://www.wpftutorial.net/CustomVsUserControl.html
例如,我想创建一个具有 2 个组合框的数据网格的简单组合,这些组合框负责更改数据网格项的值。我想为此创建一个特定的控件,因为我将多次使用它。我想实现背后的逻辑,然后在 xaml 调用中,我只需要指定 itemsSource。
对于此示例,我应该创建用户控件还是自定义控件?由于我将具有属性和逻辑,因此我是否应该为此控件提供一个视图模型?
编辑:您是否知道一些文章在这两个选项之间有明确的概念分离?
选择不仅在用户控件和自定义控件之间,而且在用户控件、自定义控件、自定义控件模板、自定义数据模板、标头模板(对于基于集合的控件)、附加属性之间进行选择。请参阅控件创作概述
我按照考虑的顺序去
- 附加属性
:如果可以实现功能,我使用附加属性。示例,数字文本框。
控制模板:当可以通过自定义控制模板来满足要求时,我使用它。示例,圆形进度条。
自定义控件:如果控件模板无法做到这一点,我使用自定义控件。前提是我需要自定义/扩展已经存在的控件。提供排序的示例,基于 GridView 中的标题行进行筛选(GridView 存在于地铁应用中,仅用于说明示例)
用户控件:最不首选的一个。仅当需要合成时,我无法使用自定义控件来做到这一点。就像你的例子一样,2 个组合框和 1 个数据网格。用户控件不提供可通过自定义控件或控件模板利用的无缝外观功能。
您已经有一些很好的答案来解释差异,但也了解自定义控件和UserControls
有不同的用途:
UserControl
通常包含某种复合行为。例如,如果你的应用程序需要在许多位置编辑联系人详细信息,则可以创建一个自定义控件,该控件具有所有数据的标签和文本字段,这些字段使用具有相关代码的提交按钮布局,并在整个应用程序中重复使用此控件。
自定义控件是从WPF
控件类之一派生的控件(例如 Control
、ContentControl
等)并且必须在代码中创建。这些控制通常有一个单一的内聚目的(TextBox
、ComboBox
、Label
),而不是作为一个整体一起行动(尽管情况不一定如此)。
对于不熟悉WPF
的人来说,UserControl
通常更容易,因为它们可以进行视觉设计。
我的建议是从UserControl
开始。您始终可以在以后将其重构为自定义控件,因为您越来越熟悉WPF
的工作方式。将控件创建为自定义控件需要了解 ControlTemplate
和 Style
s,因为您需要提供自己的控件来定义控件的外观。
当一切都说完了,只要控件行为正确,使用哪种方法都无关紧要。
有关解决同一问题的两种方法的示例,请参阅这篇文章。帖子作者想要一个可以在主要内容前面显示模态内容的控件。帖子作者实际上通过将其实现为UserControl
来回答自己的问题。我在帖子中添加了一个答案,该答案将控件创建为自定义控件,但两者都具有相同的最终效果。
-
如果您有视图模型,并且希望为其创建视图,请使用用户控件。
-
如果您需要没有特定视图模型的自主控件,
您可能需要自定义控件。 -
如果您发现所需的功能作为一个整体已存在于其他控件中,则需要重写现有控件模板。
(即:对于菱形按钮 - 您需要覆盖按钮控件模板。
关于附加属性和附加行为,当您有一个控件,您希望使用 更多属性进行扩展,或者您希望它的行为与其默认行为略有不同时,它们非常有用。
在OP所描述的组合物的提供情况下,可以使用用户控制或自定义控制来实现。我更喜欢自定义控件,因为没有提供特定的视图模型,"input"只是绑定到项目集合的属性。
哦,还有,很抱歉有点迟到了。
最好的解释是在 msdn 中。CustomControl更像是一个"虚拟"名称,WPF中没有名为"CustomControl"的类,相反,它意味着在WPF控件类之一(如Control
,ItemsControl
甚至更具体的控件(如TextBox
或Button
)之上创建一个新的类构建。
对于您的特定情况,用户控件应该就足够了,创建自定义控件是可以轻松避免的。虽然这不是一件坏事,但很多人,尤其是来自 WinForms 的 WPF 初学者,倾向于更多地进行子类。
如果这是您第一次构建控件,我推荐UserControl,因为VS可以让你更轻松地设计其界面。自定义控件功能更强大,但您必须清楚地将控件的逻辑与其界面分开,这需要更多的准备。
您可以轻松地直观地设计CustomControl
。创建新UserControl
(或窗口)。在设计器中直观地创建其 xaml 结构。将生成的 xaml 的正文复制粘贴到新CustomControl
ControlTemplate
内(例如,在通用主题文件中)。
如果我没记错的话,您还可以直接在 Blend 中直观地设计自定义控件模板。
当然,您也可以在窗口中实例化 wip 自定义控件,并将窗口的设计器视图作为新面板放在 VisualStudio 中控件的 xaml 视图上方。样式模板中的某些 xaml 绑定不会像这样显示在设计器中,直到我重新生成。
[恕我直言,GUI主要是一个视觉问题,不应该也不需要在代码中创建。
要创建自定义控件,您需要将其实现为用户控件。您自己的用户控件称为自定义控件。这很简单。
用户控件是用于包含自定义内容的基类:
<UserControl>
Your custom WPF content
</UserControl>
我不完全同意这篇文章。但是,在您的情况下,您需要一个可以在 UI 中重用后者的用户控件。