控件开发选型指南
本文概要
如果你是从WinForm框架转到WPF框架的开发人员,我想你肯定是已经超级厌烦了WinForm自定义控件的复杂程度,笔者也是在这种情况下转为WPF开发。通过阅读本文你将学会一种技能,这种技能会让你在面对非标准控件(标准控件是指微软提供的类库中的控件)的开发不至于手足无措,它像黑夜里的灯塔,给你在编写非标准控件时提供指引。
面对非标准控件,我们应该想些什么?
当我们面对非标准控件的开发时,我们一般会有三种想法:
- 有没有满足我需求的第三方库
- 有没有其他开发人员已经实现我们的需要或相似的需求
- 自己重新造轮子
显然本文肯定不是想要教会我们怎么使用Github或者Nuget去搜索满足我们需求的第三库,因此第1、2两点我们不考虑;这里假设我们面对的需求就是需要我们自己重新造轮子,那么,我们应该怎么选择呢?有哪些好的标准和尺子来做衡量我们的选择呢?
控件选型的标准和尺子
如果我们对样式、绑定、控件模板、数据模板、类型转换器等WPF的基础知识已经了解,那么我们应该知道WPF框架提供的控件都是无外观的控件,具体就是WPF框架将控件的功能(行为)和外观进行了剥离,也就是分开定义;对于Controls中的类来说,.cs用来定义控件有那么功能(行为),而用ControlTemplate来定义控件的展示外观;DataTemplate用来布局数据的展示外观,知道了这两点之后,我们面对非标准控件的编写就需要顺序考虑一下几点:
- 列出非标准控件的功能列表
- 对标标准库中,查找是否有相似的功能控件,如果有跳到第3步,如果没有跳到第4步
- 考虑使用DataTemplate是否可以达到需求,可以,则结束选型;不能,则考虑使用ControlTemplate来实现需求,同样结束选型
- 考虑是否可以通过附件属性扩展标准控件来满足需求,如果可以跳回第3步,不可以,跳到第5步
- 考虑需求的功能列表是否可以通过组合来实现,如果可以则使用UserControl来实现,结束选型;如果不可以,则跳到第6步
- 自定义控件,如果到了需要自定义控件的步骤,那么自定义控件的基类选择同样重要,我们可以选择FrameworkElement或者Control,选择基类的原则是,尽量少编码
举了例子
通过上面的阅读,接下来我们来举个例子。这里需要我们编写一个环形进度条的控件。
首先这个需求需要一个基于Rang和Value控件,在标准控件中,我们有抽象类RangeBase、具体类Slider以及ProgressBar;RangeBase是一个抽象类,如果标准库中提供的它的子类都不满足需求,我们可以选择这个类用于自定义控件的基类。而Slider和ProgressBar的区别在于Value是否可以通过UI进行交互,而我们的需要是不需要交互的,因此,我们选择ProgressBar类。
接下来,我们考虑是修改ProgressBar的DataTemplate属性还是修改ControlTemplate来达到需求呢?很显然ProgressBar的默认外观是不符合我们需求的,因此我们需要修改ControlTemplate。
通告
下篇文章笔者将演示在编写环形进度条控件中使用视觉分层艺术对WPF开发的重要性