Winforms DatetimePicker 使用箭头切换月份时选择每个月的第一天
Winforms DatetimePicker when switching months using Arrow selects 1st day of every month
当我默认使用左右箭头在日期时间选择器中切换月份时,它会选择每个月的第一天。
我不希望这种情况发生在我身上。我想要相同的日期(在日期时间选择器打开之前选择的日期),除非用户选择任何其他日期。
这是设计使然。
在 WinForms 中
System.Windows.Forms.DateTimePicker
依赖于 Win32 API 组件。这意味着大部分控件再现和交互代码都是本机代码,无法从 .NET 中轻松更改。
您可以尝试 something like this, subclassing DateTimePicker
and overriding the WndProc
handler, so you can write your own implementation of the WmDateTimeChange
function (original here) 并强制 value
的日期与 validTime
的日期相同,因为您检测到月份跳跃。此类修改可能会在 Windows 的未来版本中中断,因此除了学习和实验外,不鼓励进行任何其他操作。
在 WPF 中
DatePicker
使用 Calendar
控件来表示其弹出窗口。
当我们在参考源中查看从月视图调用操作 OnNextClick
和 OnPreviousClick
时发生的情况时,我们可以看到 DiscardDayTime
函数 is called to switch to 第一个目标月份:
return new DateTime(d.Year, d.Month, 1, 0, 0, 0);
我建议将控制子类化并用代码覆盖那些事件处理程序以保留日期,并处理目标月份的天数少于当前月份的情况,但我担心 [= DatePicker
实现使用的 18=] 实例无法从用户代码访问。据我所知,DatePicker
也没有公开那些内部事件。
当我默认使用左右箭头在日期时间选择器中切换月份时,它会选择每个月的第一天。
我不希望这种情况发生在我身上。我想要相同的日期(在日期时间选择器打开之前选择的日期),除非用户选择任何其他日期。
这是设计使然。
在 WinForms 中
System.Windows.Forms.DateTimePicker
依赖于 Win32 API 组件。这意味着大部分控件再现和交互代码都是本机代码,无法从 .NET 中轻松更改。
您可以尝试 something like this, subclassing DateTimePicker
and overriding the WndProc
handler, so you can write your own implementation of the WmDateTimeChange
function (original here) 并强制 value
的日期与 validTime
的日期相同,因为您检测到月份跳跃。此类修改可能会在 Windows 的未来版本中中断,因此除了学习和实验外,不鼓励进行任何其他操作。
在 WPF 中
DatePicker
使用 Calendar
控件来表示其弹出窗口。
当我们在参考源中查看从月视图调用操作 OnNextClick
和 OnPreviousClick
时发生的情况时,我们可以看到 DiscardDayTime
函数 is called to switch to 第一个目标月份:
return new DateTime(d.Year, d.Month, 1, 0, 0, 0);
我建议将控制子类化并用代码覆盖那些事件处理程序以保留日期,并处理目标月份的天数少于当前月份的情况,但我担心 [= DatePicker
实现使用的 18=] 实例无法从用户代码访问。据我所知,DatePicker
也没有公开那些内部事件。