自定义与用户控制

时间:2012-06-28 15:16:55

标签: wpf user-controls wpf-controls custom-controls viewmodel

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

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

对于此示例,我应该创建用户控件还是自定义控件?由于我将拥有属性和逻辑,我应该有一个用于此控件的viewmodel吗?

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

7 个答案:

答案 0 :(得分:79)

选择不仅在用户控件和自定义控件之间,还包括用户控件,自定义控件,自定义控件模板,自定义数据模板,标题模板(基于集合的控件),附加属性。 请参阅Control Authoring overview

我遵循以下考虑顺序

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

  2. 控制模板:通过自定义控件模板可以满足需求时,我会使用它。例如,循环进度条。

  3. 自定义控件:如果控件模板无法执行,我使用自定义控件。如果我需要定制/扩展已存在的控件。示例提供基于GridView中标题行的排序,过滤(GridView存在于metro应用程序中,仅用于说明示例)

  4. 用户控制:最不受欢迎的一个。仅在需要合成时,我无法使用自定义控件。就像在你的例子中,2个Combobox和1个datagrid。用户控件不提供可通过自定义控件或控件模板利用的无缝外观功能。

答案 1 :(得分:39)

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

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

自定义控件是从WPF控件类之一(E.G。ControlContentControl等)派生的控件,必须在代码中创建。 这些控制通常只有一个共同的目的(想象TextBoxComboBoxLabel),而不是作为一个整体共同行动(尽管不一定如此)。

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

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

当完成所有操作后,只要控件行为正确,您使用哪种方法都无关紧要。

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

答案 2 :(得分:7)

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

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

答案 3 :(得分:6)

  • 如果拥有视图模型,并且您希望为其创建视图,请使用用户控制

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

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

  • 关于附加属性和附加行为,如果您想要使用更多属性扩展控件,或者希望它的行为与默认行为略有不同,那么这些属性非常有用。

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

哦,我很抱歉有点迟到。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

您可以轻松地以视觉方式设计CustomControl。 创建新的UserControl(或窗口)。在Designer中直观地创建其xaml结构。在新ControlTemplate的{​​{1}}内复制粘贴生成的xaml的主体(例如,在通用主题文件中)。

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

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

[Imho GUI主要是一个视觉问题,不应该,也不需要在代码中创建。 ]

答案 6 :(得分:-1)

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

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

<UserControl>
  Your custom WPF content
</UserControl>

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