首页 文章

自定义与用户控制

提问于
浏览
39

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

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

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

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

8 回答

  • 75

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

    我遵循以下顺序考虑

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

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

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

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

  • 31

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

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

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

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

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

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

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

  • 5

    最好的解释是msdn . CustomControl更像是"virtual"名称,在WPF中没有名为"CustomControl"的类,而是意味着在WPF控件类之一上创建一个新类,如 ControlItemsControl 以及更具体的控件,如 TextBoxButton .

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

  • 7
    • 如果您 have a view-model 并且您希望为其创建视图,请使用 User-Control .

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

    • 如果您发现其他控件中的 functionality you need as whole, already exist ,则需要覆盖现有的 control template .
      (即:对于菱形按钮 - 您需要覆盖按钮控制模板 . )

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

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

    哦,我很抱歉有点迟到了 .

  • -1

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

  • 1

    (很抱歉发帖作为答案,无法发表评论 . 如果你发现它有用,请随意将其添加为评论,例如 . 本杰明的回答?)

    你可以轻松地在视觉上设计 CustomControl . 创建新的 UserControl (或窗口) . 在Designer中以可视方式创建其xaml结构 . 在新的 CustomControlControlTemplate 中复制粘贴生成的xaml的主体(例如,在通用主题文件中) .

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

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

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

  • 0

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

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

    <UserControl>
      Your custom WPF content
    </UserControl>
    

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

  • 1

    您始终可以依赖不言自明的微软风格描述:

    用户控件(WPF) - Windows Presentation Foundation用户控件
    自定义控件(WPF) - Windows Presentation Foundation自定义控件

相关问题