WPF 4.0 DatePicker 快速录入

原文: WPF 4.0 DatePicker 快速录入

WPF 4.0的DatePicker在经过键盘录入日期的时候是很是让人郁闷的。必须按照日期的格式来完整输入
例如,好比输入“2010/10/10”才能识别。而实际上在一些要求快速录入的场合,用户更但愿直接敲20101010就好了。
遗憾的是,DatePicker没有一个属性能够设置说录入的格式是yyyyMMdd这种的。

实际上,仔细看一下DatePicker控件,它有一个DateValidationError事件,当输入的文本没法识别为日期时,就会触发该事件。咱们能够利用这个事件来作一些事情。

为了方便使用,咱们能够封装一个附加属性,在须要快速录入的地方Attach一下就行了。

public static readonly DependencyProperty EnableFastInputProperty =
         DependencyProperty.RegisterAttached("EnableFastInput", typeof(bool), typeof(DatePickerHelper),
                new FrameworkPropertyMetadata((bool)false,
                new PropertyChangedCallback(OnEnableFastInputChanged)));

public static bool GetEnableFastInput(DependencyObject d)
{
       return (bool)d.GetValue(EnableFastInputProperty);
}

public static void SetEnableFastInput(DependencyObject d, bool value)
{
       d.SetValue(EnableFastInputProperty, value);
}

这样,咱们就给一个DatePickerHelper类型注册了一个附加属性,叫作EnableFastInput。
在这个属性的PropertyChanged事件处理函数中,咱们监听DatePicker的DateValidationError事件
private static void OnEnableFastInputChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
      var datePicker = d as DatePicker;
      if (datePicker != null)
      {
            if ((bool)e.NewValue)
            {
                  datePicker.DateValidationError += DatePickerOnDateValidationError;
            }
            else
            {
                  datePicker.DateValidationError -= DatePickerOnDateValidationError;
            }
      }
}

在事件处理中,咱们尝试着解析文本,而且设置日期:
private static void DatePickerOnDateValidationError(object sender, DatePickerDateValidationErrorEventArgs e)
{
       var datePicker = sender as DatePicker;
       if (datePicker != null)
       {
             var text = e.Text;
             DateTime dateTime;
             if (DateTime.TryParseExact(text, "yyyyMMdd", CultureInfo.CurrentUICulture, DateTimeStyles.None, out dateTime))
             {
                   datePicker.SelectedDate = dateTime;
             }
       }
}
在Xaml中使用时:
<DatePicker l:DatePickerHelper.EnabledFastInput="True"/>

这样,DatePicker就支持直接输入yyyyMMdd格式的日期了。
固然,这里的日期格式是写死的,能够考虑封装成另一个DatePickerHelper.InputDateFormat属性之类的,更加灵活html

 

【效果图】函数

 

原文(有源码):http://www.cnblogs.com/RMay/archive/2010/05/27/1745636.html3d

相关文章
相关标签/搜索