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