自定义与用户控制

Lou*_*uro 48 wpf user-controls custom-controls wpf-controls viewmodel

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

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

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

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

Til*_*lak 82

选择不仅在用户控件和自定义控件之间,还包括用户控件,自定义控件,自定义控件模板,自定义数据模板,标题模板(基于集合的控件),附加属性.请参阅控制编写概述

我遵循以下顺序考虑

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

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

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

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

  • +1很棒,我会切换CustomControl和UserControl,但除此之外你应该考虑如何实现自定义ui逻辑.事实上,我总是将CustomControl视为最后一个可能的选项,并喜欢使用附加行为来完成任务. (4认同)

Ben*_*ale 40

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

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

自定义控件是从其中一个WPF控件类(EG 等)派生的控件Control,ContentControl必须在代码中创建.这些控制通常有一个凝聚力的目的(想TextBox,ComboBox,Label),而不是作为一个整体共同行动(虽然这并不一定是这种情况).

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

我的建议是从一开始UserControl.随着您对工作方式的熟悉程度越来越高,您可以随时将其重构为自定义控件WPF.创建控件作为自定义控制需要的知识ControlTemplateS和StyleS作为你将需要提供自己的定义的外观和感觉你的控制.

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

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


dow*_*for 7

最好的解释是在msdn中.CustomControl更多的是"虚拟"的名字,也没有所谓的"CustomControl"在WPF类,而不是它意味着创造的WPF控件类,像一顶一类新的建筑Control,ItemsControl以及像更具体的控件TextBoxButton.

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


G.Y*_*G.Y 6

  • 如果您有视图模型并且希望为其创建视图,请使用User-Control.

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

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

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

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

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