自定义WPF日期时间选择器

在WinForms中,经常使用DateTimePicker控件来选择日期和时间。但在WPF中,虽然有DatePicker控件,但并不完全满足需求。需要的是能够通过Tab键轻松在年、月、日之间切换,并且可以使用箭头键改变值的控件。幸运的是,Qwertie为提供了一个优秀的C#版本的DateTimePicker控件,解决了一些最糟糕的问题。可以在他的GitHub Gist上查看这个版本:。

本文的代码展示了在WPF中构建用户控件时所需的一些基本技术。

使用代码

要使用这个代码,只需编译DTPicker并将其DLL添加到项目中。(或者将DTPicker项目作为子项目包含到项目中。解决方案包含两个项目:DTPicker,其中包含用户控件,以及TestDTPicker,这是一个小型的WPF项目,用于测试DateTimePicker。)

XAML

控件的XAML非常直接。

2001-01-01 12:30

代码

控件中有四个主要变量:

  • SelectedDate - 选择的日期
  • DateFormat - 显示日期的格式(例如yyyy-MM-dd等)
  • MinimumDate - 可以选择的最小日期值
  • MaximumDate - 可以选择的最大日期值

有趣的是,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
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485