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