我最近做了一个 UserControl ,花了很长时间,因为我不得不使用自定义依赖属性等等......
无论如何,它只是一堆3个控件:TextBox,Popup with Hierarchical Tree。
现在我意识到我可能只能写一个 ControlTemplate 。那么使用UserControl 的好处是什么?
答案 0 :(得分:57)
这里有三种情况需要考虑:UserControl,ControlTemplate和自定义控件。 (我猜测DataTemplate不需要解释)
在您创建新UI组件的基本功能时,您提供了自定义控件。这有各种各样的优点和缺点,但是,例如,如果你想要ItemsControl的自定义选择行为,你最好通过继承Selector或MultiSelector(wpftoolkit DataGrid这样做)来做。此外,如果您想要一个包含新DependencyProperty的对象,您在大多数情况下都会从Control派生。
这里包含的wpf原则是“无视”控制范例,或者“确保期望有人模仿你的控件,或者至少让它在你自己的模板场景中表现得很好”。自定义控件通常在创建时考虑了可重用性,通常作为框架dll的一部分。
ControlTemplate 本质上是替换可视树的描述,可以在FrameworkElements上显式设置,也可以作为Style的一部分设置。当您的目标主要是制作应用程序并完成它时,这是您应该瞄准的选项。如果你能够获得绑定和触发器(以及可能包含Style本身),你可以直观地使用ControlTemplate做任何事情。所有这些都可以被声明为重用的资源,为您的应用程序提供一个共同的“主题”。
UserControl 是一个独立的复合控件,其中的部件可以在设计器中单独编辑,如果您需要查看组件并在设计器中管理它们,则最好使用它。另一方面,ControlTemplate不会在设计器中公开其组件以进行操作(尽管它是可见的)。您通常为客户详细信息页面或产品显示浏览器创建UserControl,或者您不想创建完整控件但需要完整设计器支持的详细视图。
这里的一个特例是你使用MVVM模式。许多优秀的MVVM实现使用UserControls作为Views,ControlTemplates和Styles作为这些视图使用的资源。 MVVM实践还最大限度地减少了对自定义控件的需求,并具有许多其他好处。
(有关MVVM的更多信息,其中包括Google for Josh Smith,Sacha Barber和Karl Shifflett的精彩文章)
答案 1 :(得分:3)
如果要添加自己的依赖项属性,那么您将需要自己的类来定义它们。
由于您要将模板应用于班级,因此此自定义类必须从Control
派生(如UserControl
所示)。
编写自己的Control
派生类的主要好处是,可以在应用程序中或其他类型的用户为其他使用场景重新定义其模板。
使用UserControl
类的开销很小。事实上,如果你在Reflector.NET中查看它,你会发现它几乎没有任何代码。首先,UserControl
只是重新定义了某些现有依赖项属性的元数据(例如,将FocusableProperty
false
设置为默认值。)
除非您需要立即重新定义控件的模板,否则现在可以将其保留为UserControl
,如果需要,可以稍后更改。