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