сделать отложенное событие mousedown

У меня есть datagridview, в ячейках которого есть событие щелчка. Ячейки также имеют следующее событие mouseDown:

if (e.Button == MouseButtons.Left && e.Clicks == 1)
{
    string[] filesToDrag = 
    {
        "c:/install.log"
    };

    gridOperations.DoDragDrop(new DataObject(DataFormats.FileDrop, filesToDrag), DragDropEffects.Copy);
}

всякий раз, когда я пытаюсь щелкнуть ячейку, мгновенно срабатывает событие mousedown и пытается перетащить ячейку. Как я могу заставить событие mousedown срабатывать только в том случае, если пользователь, например, удерживал мышь в течение 1 секунды? Спасибо!


person Kristian    schedule 26.01.2013    source источник
comment
Я склонен делать это не по времени, а по расстоянию, на которое переместился указатель, пока удерживается кнопка.   -  person lc.    schedule 26.01.2013
comment
@лк. Мне нравится эта идея. Что-то вроде перетаскивания по инерции?   -  person J. Steen    schedule 26.01.2013
comment
@ J.Steen В основном. Я сохраняю состояние при нажатии кнопки и проверяю, что указатель перемещается за определенное пороговое расстояние (в OnMouseMove). Насколько я понимаю, большинство приложений реагируют именно так, и это кажется естественным. Попробуйте перетащить что-нибудь на этой странице, например, и посмотрите, как изменится курсор.   -  person lc.    schedule 26.01.2013
comment
@лк. О, да. Странно естественно. Я должен помнить этот шаблон UX.   -  person J. Steen    schedule 26.01.2013


Ответы (1)


Правильный способ сделать это не по времени, а запустить его, когда пользователь достаточно переместит мышь. Универсальным показателем «достаточно перемещенных» в Windows является размер двойного щелчка. Реализуйте обработчики событий CellMouseDown/Move, подобные этому:

    private Point mouseDownPos;

    private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) {
        mouseDownPos = e.Location;
    }

    private void dataGridView1_CellMouseMove(object sender, DataGridViewCellMouseEventArgs e) {
        if ((e.Button & MouseButtons.Left) == MouseButtons.Left) {
            if (Math.Abs(e.X - mouseDownPos.X) >= SystemInformation.DoubleClickSize.Width ||
                Math.Abs(e.Y - mouseDownPos.Y) >= SystemInformation.DoubleClickSize.Height) {
                // Start dragging
                //...
            }
        }
    }
person Hans Passant    schedule 26.01.2013
comment
Идеально! Большое спасибо, сэр! - person Kristian; 27.01.2013
comment
Возможно, SystemInformation.DragSize будет лучшим выбором. - person Stefan Egli; 18.09.2019