如何捕获 MonthCalendar 控件的双击事件?我尝试使用 MouseDown 的 MouseEventArgs.Clicks 属性,但它始终为 1,即使我双击。
问问题
4855 次
3 回答
5
请注意,MonthCalendar 在属性窗口中既不显示 DoubleClick 也不显示 MouseDoubleClick 事件。肯定有问题的迹象,本机 Windows 控件会阻止生成这些事件。您可以通过观察 MouseDown 事件并测量点击之间的时间来合成您自己的。
向您的项目添加一个新类并粘贴如下所示的代码。编译。从工具箱顶部删除新控件。为 DoubleClickEx 事件编写事件处理程序。
using System;
using System.Windows.Forms;
class MyCalendar : MonthCalendar {
public event EventHandler DoubleClickEx;
public MyCalender() {
lastClickTick = Environment.TickCount - SystemInformation.DoubleClickTime;
}
protected override void OnMouseDown(MouseEventArgs e) {
int tick = Environment.TickCount;
if (tick - lastClickTick <= SystemInformation.DoubleClickTime) {
EventHandler handler = DoubleClickEx;
if (handler != null) handler(this, EventArgs.Empty);
}
else {
base.OnMouseDown(e);
lastClickTick = tick;
}
}
private int lastClickTick;
}
于 2011-12-14T13:42:00.633 回答
3
您需要自己跟踪点击事件。您需要使用 DateSelected 事件来标记单击日期的时间,并使用 DateChanged 事件来“重置”时间跨度,这样您就不会将单击不同日期视为双击。
注意:如果你使用鼠标按下事件,你会得到错误的行为
无论单击什么都会发生鼠标按下事件,例如单击日历的月/年等标题将与单击实际日期一样注册。因此使用 DateSelected 而不是鼠标按下事件。
private DateTime last_mouse_down = DateTime.Now;
private void monthCalendar_main_DateSelected(object sender, DateRangeEventArgs e)
{
if ((DateTime.Now - last_mouse_down).TotalMilliseconds <= SystemInformation.DoubleClickTime)
{
// respond to double click
}
last_mouse_down = DateTime.Now;
}
private void monthCalendar_main_DateChanged(object sender, DateRangeEventArgs e)
{
last_mouse_down = DateTime.Now.Subtract(new TimeSpan(1, 0, 0));
}
于 2014-11-18T17:24:40.830 回答
0
最好添加以下代码,否则如果您快速单击两个日期,您将获得该事件。
protected override void OnDateChanged(DateRangeEventArgs drevent) {
lastClickTick = Environment.TickCount - 2 * SystemInformation.DoubleClickTime;
base.OnDateChanged(drevent);
}
于 2014-03-19T13:40:08.077 回答