2011-12-14 60 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)); 
} 
相關問題