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