自定义与用户控制

Posted

技术标签:

【中文标题】自定义与用户控制【英文标题】:Custom vs User control 【发布时间】:2015-10-14 18:15:42 【问题描述】:

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

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

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

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

【问题讨论】:

据我所知,自定义控件只是编译好的用户控件(或基本控件) @DavidBrunelle 绝对不是。模板的不同处理方式应该已经说明了这一点。此外,UserControl 不能有样式,这对几乎所有自定义控件都至关重要。 请参阅So What's the Difference Between a Custom Control and User Control? 以获得很好的细分 【参考方案1】:

选择不仅在用户控件和自定义控件之间,而且在用户控件、自定义控件、自定义控件模板、自定义数据模板、标题模板(用于基于集合的控件)、附加属性之间进行选择。 参考Control Authoring overview

我按照考虑的顺序去

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

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

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

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

【讨论】:

+1 太好了,我会切换 CustomControl 和 UserControl,否则这正是您应该考虑如何实现自定义 UI 逻辑的方式。事实上,我总是将 CustomControl 视为最后可能的选择,并且喜欢使用附加行为来完成任务。 粗心的行为使我远离用户控制。 我也很喜欢附加行为。它们使代码更干净,但同时,我不喜欢过度使用,附加属性就足够了,并且不需要太多管道 另请注意,如果以后想将您的元素用作容器,则应避免使用 UserControl,因为您无法将 x:Names 分配给其子元素。 More info【参考方案2】:

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

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

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

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

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

说到底,只要控件行为正确,您使用哪种方法都没有关系。

请参阅this 帖子以获取解决同一问题的两种方法的示例。帖子作者想要一个可以在主要内容前面呈现模态内容的控件。帖子作者实际上通过将其实现为UserControl 来回答他自己的问题。我在帖子中添加了一个答案,该帖子将控件创建为自定义控件,但两者具有相同的最终效果。

【讨论】:

【参考方案3】:

如果您有一个视图模型并希望为其创建一个视图,请使用用户控件

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

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

关于附加属性和附加行为,当您想要使用更多属性扩展控件或希望其行为与默认行为稍有不同时,它们非常有用。

李>

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

哦,还有,抱歉有点晚了。

【讨论】:

【参考方案4】:

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

对于您的具体情况,一个 UserControl 就足够了,创建一个 CustomControl 是很容易避免的。虽然这不是一件坏事,但很多人,尤其是来自 WinForms 的 WPF 初学者倾向于在必要时进行子类化。

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

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

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

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

【讨论】:

【参考方案7】:

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

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

<UserControl>
  Your custom WPF content
</UserControl>

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

【讨论】:

感谢您的快速响应。那么 viewmodel 选项呢?我想让 XAML 尽可能简单,我想只拥有一个公共属性来接收一个 ID,该 ID 将在内部用于对业务层进行一些调用以获取数据。对于这种情况,拥有一个视图模型对我来说是有意义的,但我不知道我是否会失去再利用能力。 @MBen 抱歉,我可能不明白您的第一句话,但是“要创建自定义控件,您需要将其实现为用户控件”,这是完全错误的,CustomControl 与UserControl,实际上你可以编写一个没有任何 UserControls 的巨大应用程序。此外,“您的 UserControl 被称为自定义控件”也是错误的,UserControl 不是原始意义上的 CustomControl,子类化 WPF 控件,或者您的其他 CustomControls 被称为 CustomControl。 @dowhilefor 我同意你的看法。但是对我来说,自定义控件是一个预构建的控件,将被其他开发人员重复使用。如果我理解得很好,Louro 就是这种情况。我同意你的观点,你可以在不使用 UserControl 的情况下构建一个巨大的应用程序。当您特别想成为可重用的 UI 时,使用 UserControl。 @Louro 在构建自定义用户控件时,您的 ViewModel 需要是 DependencyObject 才能声明 Dependency 属性。依赖属性是您将用于在 XAML 中绑定的内容。我会在 ViewModel 中将 ID 声明为 dependencyProperty。 @MBen ben 再次抱歉,但这也是错误的。 ViewModel 不需要是 DependencyObject(具有依赖属性的先决条件),它只需要实现 INotifyPropertyChanged。

以上是关于自定义与用户控制的主要内容,如果未能解决你的问题,请参考以下文章

自定义与用户控制

如何添加到自定义列表视图用户控制编辑项目列组等任务?

用户控制 - 自定义属性

Spring boot 用户自定义访问控制,自定义登录页面,退出,用户信息获取

Spring boot 用户自定义访问控制,自定义登录页面,退出,用户信息获取

Vue前端用户权限控制大全