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 ,并在需要时再进行更改。