WPF ControlTemplate与UserControl的区别

43

最近我制作了一个,由于要使用自定义依赖属性等功能,所以花费了很长时间。

总之,它只是由3个控件组成:文本框、带有分层树的弹出窗口。

现在我意识到可能只需编写即可。那么使用的好处是什么?


请参见 https://dev59.com/LV0b5IYBdhLWcg3wUP0X#29339295。 - Filip Skakun
2个回答

61
这里有三种情况需要考虑:UserControl、ControlTemplate和自定义控件。(我猜DataTemplate无需解释)
一个“自定义控件”是在创建新UI组件的基础功能时提供的东西。这有各种各样的优缺点,例如,如果您想要ItemsControl的自定义选择行为,最好通过继承Selector或MultiSelector(wpftoolkit DataGrid就是这样做的)来实现。此外,如果您想要一个包含新DependencyProperty的对象,在大多数情况下将从Control派生。
这里包含的WPF原则是“无外观”的控件范例,或者说“确保期望有人对您的控件进行模板化,或者至少在您自己的模板场景中使其表现良好”。通常为了可重用性而创建自定义控件,通常作为框架dll的一部分。
ControlTemplate本质上是替换可视树的描述,并且可以显式地设置在FrameworkElements上,也可以作为Style的一部分设置。当你的目标主要是创建一个应用程序并完成它时,你应该采用这种选项。如果你能正确地获取绑定和触发器(以及可能包含的Style本身),你几乎可以在视觉上做任何事情。所有这些都可以声明为资源并重用,为您的应用程序提供共同的“主题”。
UserControl是一个自包含的复合控件,其中的部分可以在设计器中单独编辑,并且最好在需要在设计器中查看和管理组件时使用。另一方面,ControlTemplate不会公开其组件以在设计器中操作(虽然它将可见)。通常为客户详细信息页面、产品显示浏览器或任何您不想创建完整控件但希望具有完全设计师支持的详细视图而创建UserControl。

这里有一个特殊情况,如果您使用MVVM模式。许多优秀的MVVM实现将UserControl作为视图,ControlTemplates和Styles作为这些视图使用的资源。 MVVM实践还可以将自定义控件的需求降到最低,并具有许多其他好处。

(要了解更多关于MVVM的信息,可以在Google上搜索Josh Smith、Sacha Barber和Karl Shifflett的出色文章等)


3
如果您正在添加自己的依赖属性,则需要自己的类来定义这些属性。
由于您想将模板应用于该类,因此这个自定义类必须派生自Control(如UserControl所做的那样)。
编写自己的Control派生类的主要好处是,它可以重新定义其模板以供其他使用场景使用,无论是您在应用程序内部还是类型的其他用户。
使用UserControl类几乎没有任何开销。 事实上,如果您在Reflector.NET中查看它,您会发现它几乎没有任何代码。 主要地,UserControl只是重新定义了一些现有依赖属性的元数据(例如,将FocusableProperty的默认值设置为false)。
除非您立即需要重新定义控件的模板,否则可以将其保留为UserControl,并在需要时稍后更改。

我理解的主要区别是,我可以为该控件提供新的依赖属性。但我认为所有其他更改都可以在样式、触发器或模板中设置。是这样吗? - theSpyCry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接