5

如何捕获 MonthCalendar 控件的双击事件?我尝试使用 MouseDown 的 MouseEventArgs.Clicks 属性,但它始终为 1,即使我双击。

4

3 回答 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 回答