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

相關文章
相關標籤/搜索