由于项目对更改日期 时间的需要,接触了一下Calendar控件。结果发现在这么强大的控件的背后,微软其实并没有为开发人员留有很强的扩展性。
(项目要求的Calendar控件能对一些特定的日期进行特殊处理,如高亮,以及类似于Outlook的Calendar一样,可以编辑会议,提醒什么的。)
Calendar里有一些控件如:CalendarItem,CalendarButton,CalendarDayButton。这些控件都被定义成了sealed。所以当我们要对Calendar控件做一些自定义的时候,我们就不能按照对待普通的其他控件的方式对待它(常规做法是我们创建一个控件,然后继承我们需要自定义的控件,为其添加一些依赖属性什么的。。)。
所以剩下的解决方案是
1.创建一个扩展性更强的Calendar控件。
2.使用Converter处理。
对于方案1,那肯定是吃力不讨好,Calendar控件本身相当的复杂,自己创建一个类似的控件费时费力,而且肯定不免有许多Bug。因此剩下的我们最好是使用方案2(Charles
Petzold在MSDN杂志中有一篇文章讲的就是这个,请参考:Customizing the New WPF Calendar
Controls)。
对于方案2.
我现在是在Converter中定义了一些属性(一个DateTime的集合,一个String的集合),然后在上面提及的Sealed的控件的Template中通过Converter做一些处理。
有关Calendar控件的扩展,Codeproject上有一些文章,参考:
rudigrobler 的 Creating an Outlook Calendar using WPF
系列
David Veeneman 的 Extending the WPF Calendar Control
WPF- 关于自定义Calendar控件