2011-12-14 59 views
4

如何捕获MonthCalendar控件的doubleclick事件?我试过使用MouseDown的MouseEventArgs.Clicks属性,但它始终是1,即使我双击。在Windows窗体应用程序中为MonthCalendar控件捕获doubleclick

+0

您能解释一下日历控件引用的内容以及您定位的是哪个版本的.NET Framework? –

+0

本地MonthCalendar没有双击事件。你想达到什么目的? – UnhandledExcepSean

+0

@Witchunter,我很抱歉,我的意思是System.Windows.Forms.MonthCalendar。 –

回答

4

请注意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; 
} 
+0

除了定义和调用自己的事件,您可以调用'base.OnDoubleClick(EventArgs.Empty)'和'base.OnMouseDoubleClick(e);'并使用标准事件。 – Chaquotay

+0

这并没有什么帮助,事件隐藏在“属性”窗口和IntelliSense中。 –

+0

至少在我的环境中,标准doubleclick事件不会隐藏在IntelliSense中。但是对于属性窗口你是对的:-( – Chaquotay

0

最好添加下面的代码,否则如果你快速点击两个日期你将有事件。

protected override void OnDateChanged(DateRangeEventArgs drevent) { 
     lastClickTick = Environment.TickCount - 2 * SystemInformation.DoubleClickTime; 
     base.OnDateChanged(drevent); 
    } 
2

您需要自己跟踪点击事件。您需要使用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)); 
} 
相关问题