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






4.99/5 (58投票s)
一个具有文化感知功能的月份日历和日期选择器。
- 下载 VS 2013 演示版 - 106 KB - 105.6 KB
- 下载 VS 2012 演示版 - 107 KB - 106.9 KB
- 下载 VS 2010 源代码 - 95 KB - 94.9 KB
- 下载 VS 2010 演示版 - 108 KB - 108.2 KB
引言
如截图所示,这是一个月份日历控件和日期选择器控件,有点类似于微软内置的控件。它不是用 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
事件,您可以在其中检查并设置输入的日期是否有效。如果无效,则日期将使用 InvalidBackColor
和 InvalidForeColor
属性的颜色显示。
另一个重要属性是 ClosePickerOnDayClick
。使用它,您可以调整在点击某一天时是否关闭选择器,无论该日期是否已被选中。
扩展加粗日期
DatePicker 和 MonthCalendar 控件现在有两个新属性
BoldedDateCategoryCollection
BoldedDatesCollection
第一个集合包含加粗日期的类别定义,第二个集合包含带有相应类别的加粗日期。
用于定义加粗日期的原始属性与以前一样。
使用本地数字
两个控件都有一个新属性
- UseNativeDigits
此属性将控件中显示的任何数字转换为包含当前 Culture
中的
NativeDigits
的字符串。
如果将当前 Culture
设置为波斯语 (fa-IR),则此文化没有阿拉伯数字
而是波斯数字。
例如,波斯日期 01.01.1390(格式为 dd/MM/yyyy)将显示为
۰۱ / ۰۱ / ۱۳۹۰
如果您将日期选择器的 Culture
和 CultureCalendar
设置为波斯语,让我向您展示一张图片
此外,日期的手动输入也使用本地数字。
请注意,显示的日名(可能还有月名)可能不正确,
因为这些值取自 .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
- 现在,日期选择器控件允许将当前日期分隔符作为输入