我最近制作了一个UserControl,这花了很长时间,因为我必须使用自定义依赖属性等等......
无论如何,它只是一堆 3 个控件:TextBox、带有层次树的弹出窗口。
现在我意识到我可能只能写一个ControlTemplate。因此,使用 UserControl 有什么好处?
我最近制作了一个UserControl,这花了很长时间,因为我必须使用自定义依赖属性等等......
无论如何,它只是一堆 3 个控件:TextBox、带有层次树的弹出窗口。
现在我意识到我可能只能写一个ControlTemplate。因此,使用 UserControl 有什么好处?
这里需要考虑三种情况:UserControl、ControlTemplate 和自定义Control。(我猜 DataTemplate 不需要解释)
自定义控件是您在创建新 UI 组件的基本功能时提供的东西。这有各种优点和缺点,但例如,如果您想要自定义 ItemsControl 的选择行为,您最好通过子类化 Selector 或 MultiSelector 来实现(wpftoolkit DataGrid 会这样做)。此外,如果您想要一个包含新 DependencyProperty 的对象,大多数情况下您将从 Control 派生。
这里包含的 wpf 原则是“无外观”的控件范例,或者“一定要期待有人模板化您的控件,或者至少让它在您自己的模板场景中表现得很好”。自定义控件的创建通常考虑到可重用性,通常作为框架 dll 的一部分。
ControlTemplate本质上是替换可视化树的描述,可以在 FrameworkElements 上显式设置,也可以作为 Style 的一部分。当您的目标主要是制作应用程序并完成它时,这是您应该瞄准的选项。如果您能够正确获取绑定和触发器(以及可能包含的 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
. 设为默认值)
除非您需要立即重新定义控件的模板,否则您可以暂时将其保留为 a UserControl
,稍后根据需要进行更改。