在WinForms中,经常使用DateTimePicker控件来选择日期和时间。但在WPF中,虽然有DatePicker控件,但并不完全满足需求。需要的是能够通过Tab键轻松在年、月、日之间切换,并且可以使用箭头键改变值的控件。幸运的是,Qwertie为提供了一个优秀的C#版本的DateTimePicker控件,解决了一些最糟糕的问题。可以在他的GitHub Gist上查看这个版本:。
本文的代码展示了在WPF中构建用户控件时所需的一些基本技术。
要使用这个代码,只需编译DTPicker并将其DLL添加到项目中。(或者将DTPicker项目作为子项目包含到项目中。解决方案包含两个项目:DTPicker,其中包含用户控件,以及TestDTPicker,这是一个小型的WPF项目,用于测试DateTimePicker。)
2001-01-01 12:30
控件中有四个主要变量:
有趣的是,SelectedDate、MinimumDate和MaximumDate的值都是相互关联的。因此,在声明这些依赖属性时,必须包括一个强制回调函数。
Public Shared ReadOnly SelectedDateProperty As DependencyProperty = _
DependencyProperty.Register("SelectedDate", _
GetType(Nullable(Of Date)), _
GetType(DateTimePicker), _
New FrameworkPropertyMetadata(Date.Now, _
New PropertyChangedCallback(AddressOf OnSelectedDateChanged), _
New CoerceValueCallback(AddressOf CoerceDate)))
这里是CoerceDate函数:
Private Shared Function CoerceDate(ByVal d As DependencyObject, ByVal value As Object) As Object
Dim dtpicker As DateTimePicker = CType(d, DateTimePicker)
Dim current As Date = CDate(value)
If current < dtpicker.MinimumDate Then
current = dtpicker.MinimumDate
End If
If current > dtpicker.MaximumDate Then
current = dtpicker.MaximumDate
End If
Return current
End Function