zoukankan      html  css  js  c++  java
  • 【WPF】WPF 4.0 DatePicker 快速录入

    先发表在棒棒牛了,转过来吧。

    传送门:http://www.bbniu.com/forum/viewthread.php?tid=752&page=1&extra=#pid6692

    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属性之类的,更加灵活

    【效果图】

    【代码】

    /Files/RMay/WpfDatePicker.zip

  • 相关阅读:
    pyspider 在ubuntu上安装失败怎么搞?
    怎么在项目中使用前端包管理器bower和构建工具gulp
    Asp.net mvc 实时生成缩率图到硬盘
    如果转载优酷、土豆视频等,怎么让视频自适应宽度?
    C语言II博客作业04
    C语言I博客作业03
    C语言II博客作业02
    C语言II博客作业01
    学期总结
    The first essay
  • 原文地址:https://www.cnblogs.com/RMay/p/1745636.html
Copyright © 2011-2022 走看看