захватить двойной щелчок для элемента управления MonthCalendar в приложении Windows Form - PullRequest
4 голосов
/ 14 декабря 2011

Как мне записать событие двойного щелчка элемента управления MonthCalendar? Я пытался использовать свойство MouseEventArgs.Clicks для MouseDown, но оно всегда равно 1, даже если я дважды щелкнул.

Ответы [ 3 ]

4 голосов
/ 14 декабря 2011

Обратите внимание, что 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;
}
2 голосов
/ 18 ноября 2014

Вам нужно будет самостоятельно отслеживать события нажатия.Вам необходимо использовать событие 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));
}
0 голосов
/ 19 марта 2014

Лучше всего добавить следующий код, иначе, если вы быстро нажмете на две даты, у вас будет событие.

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