65.9K
CodeProject 正在变化。 阅读更多。
Home

文化感知月历和日期选择器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.99/5 (58投票s)

2009年12月1日

CPOL

6分钟阅读

viewsIcon

311146

downloadIcon

12704

一个具有文化感知功能的月份日历和日期选择器。

引言

如截图所示,这是一个月份日历控件和日期选择器控件,有点类似于微软内置的控件。它不是用 WPF 实现的,而是用于 WinForms 应用程序。

背景

在开发我自己的日历/日程表(类似于 Outlook 2007 中的日历)时,我需要一个月份日历。市面上有许多好的日历,但都不太符合我的需求。因此,我开始开发我自己的。在此过程中,我不只实现了一个月份日历,还实现了一个日期选择器控件。

我还想,为什么不将文化感知功能集成到控件中,以便不同国家的人也能使用它。这比我想象的要复杂,我在文化支持方面遇到了很多问题,包括框架中的一些严重错误;稍后会详细介绍。

我想在这里分享结果,因为 CodeProject 曾多次为我提供解决问题的方法。

类图

DatePicker 控件中新增了一个属性 AllowPromptAsInput
将其设置为 true 允许输入包含当前日期分隔符的日期,日期分隔符在
FormatProvider 属性中设置。

特点

  • 文化感知 - 意味着您可以设置使用的文化和日历
  • 通过 CalendarDimensions 属性可调整可见子日历的数量
  • 颜色和字体完全可定制
  • 您可以加载或保存颜色表
  • 可调整 RTL 或 LTR 布局
  • 可调整是使用最短还是缩写日名
  • 可调整是否显示周标题和脚注
  • 可调整非工作日(用于工作周选择模式)
  • 可调整一周的第一天
  • 可调整日名(完整/缩写/最短)
  • 可调整月名(完整/缩写)
  • 可调整月/日字符串模式
  • 支持可设置的最小/最大日期
  • 鼠标滚轮滚动
  • 不同的选择模式(单日/工作周/整周/手动)
  • 手动选择模式下可调整的最大可选天数
  • 加粗日期集合
  • 新增:扩展加粗日期(类别和相应的颜色定义)
  • 新增:手动选择模式现在支持使用 CTRL 键选择多个范围
  • 新增:日期分隔符现在是选择器控件中的有效输入
  • 可调整滚动更改(点击箭头时滚动多少个月)
  • 日期选择器控件支持键盘导航
  • 禁用状态支持

Using the Code

只需将控件项目添加到现有解决方案并引用它。该控件使用 VS 2010 构建,目标框架版本是 3.5。

关注点

关于控件的文化感知功能,我必须承认我不能保证所有显示和计算都是正确的。如果存在错误,请随时发布消息。

如前所述,在实现文化感知时,我遇到了框架中的一些严重错误。其中之一如下:

每个 System.Globalization.Calendar 实现都有一个方法 GetWeekOfYear()。每个日历都有一个属性 MinSupportedDateTime。如果您想从该日期获取年份的周数,那么在某些情况下,即使传递给方法的日期是有效的,您也会得到一个 ArgumentOutOfRangeException

受影响的日历实现包括 Hijri-、UmAlQura-、Hebrew-、Persian-、JulianCalendar,以及 EastAsianLunisolarCalendar 的所有实现。

另一个错误在 JapaneseCalendar 中,其中 GetYear() 方法在特定日期范围内返回 0。

我很有可能没有找到所有与日历实现相关的错误,因此如果您设置了不寻常的日历,例如 JapaneseLunisolarCalendar,可能会抛出异常。

MonthControl 的自定义

控件的渲染由一个单独的渲染器类处理。如果您想自定义绘图,则可以通过从抽象基类或默认渲染器派生来实​​现自己的渲染器。

对于实现 IXmlSerializable 的颜色表类也是如此。

调整 MonthCalendar 控件

您需要注意的一点是,只能设置非中性文化。原因是中性文化没有 DateTimeFormat 属性的值,我出于不同原因需要它。

要调整可见的子月视图,您可以直接设置 CalendarDimensions 属性,或使用设计器。

使用 ColorTable 属性,您可以调整使用的颜色,包括是否使用渐变颜色和渐变模式。

调整 DatePicker 控件

选择器文本框部分中的日期使用短日期模式显示,您也可以调整此模式。解析日期时也使用此模式。

选择器控件具有 CheckDate 事件,您可以在其中检查并设置输入的日期是否有效。如果无效,则日期将使用 InvalidBackColorInvalidForeColor 属性的颜色显示。

另一个重要属性是 ClosePickerOnDayClick。使用它,您可以调整在点击某一天时是否关闭选择器,无论该日期是否已被选中。

扩展加粗日期

DatePicker 和 MonthCalendar 控件现在有两个新属性

  • BoldedDateCategoryCollection
  • BoldedDatesCollection

第一个集合包含加粗日期的类别定义,第二个集合包含带有相应类别的加粗日期。

用于定义加粗日期的原始属性与以前一样。

使用本地数字

两个控件都有一个新属性

  • UseNativeDigits

此属性将控件中显示的任何数字转换为包含当前 Culture 中的
NativeDigits 的字符串。

如果将当前 Culture 设置为波斯语 (fa-IR),则此文化没有阿拉伯数字
而是波斯数字。

例如,波斯日期 01.01.1390(格式为 dd/MM/yyyy)将显示为

۰۱ / ۰۱ / ۱۳۹۰

如果您将日期选择器的 CultureCultureCalendar 设置为波斯语,让我向您展示一张图片

 

 

此外,日期的手动输入也使用本地数字。

请注意,显示的日名(可能还有月名)可能不正确,
因为这些值取自 .Net Framework CultureInfo 类,特别是
波斯语日名(在本例中是最短的日名)由于波斯语 (fa-IR) CultureInfo 类的错误/特性而不正确。
 

事件

月份控件具有以下重要事件

  • DateChanged:当通过上下文菜单更改月份或年份时发生
  • DateClicked:当在“日”选择模式下点击某一天时发生
  • DateSelected:当选择日期或日期范围时发生
  • SelectionExtendEnd:当选择扩展结束时发生

日期选择器有一个重要事件

  • ValueChanged:当日期值更改时发生

两个控件都有一个共同的事件

  • ActiveDateChanged:当鼠标悬停在某个日期上时发生

历史

  • 2009 年 12 月 1 日:首次发布。
  • 2011 年 10 月 12 日:扩展加粗日期并添加类别。
  • 2011 年 11 月 22 日:扩展选择以支持多个范围。
  • 2012 年 6 月 14 日
    • 实现本地数字使用
    • 项目更改为 VS 2010 项目
    • 修复了 FormatProvider 月和日名称设置相关的错误
    • 修复了日期内部解析/显示中的错误
    • 现在,当日期选择器弹出窗口打开时,阻止鼠标滚轮滚动
    • 修复了日期选择器控件的焦点问题
    • 其他一些小改进和修复
  • 2012 年 6 月 17 日
    • 现在,日期选择器控件允许将当前日期分隔符作为输入
      如果 ShortDatePattern 设置为,则有效输入为例如 06172012、061712、[0]6/17/[20]12
      MM/dd/yyyy
© . All rights reserved.