延迟触发鼠标按下事件

7

我有一个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
我倾向于通过指针在按住按钮时移动的距离来实现,而不是通过时间来实现。 - lc.
@lc. 我喜欢这个想法。一种惯性拖放的方式? - J. Steen
1
基本上,当按钮按下时,我会保存状态并检查指针是否移动超过某个阈值距离(在OnMouseMove中)。据我所知,这是大多数应用程序的响应方式,感觉很自然。例如,请尝试在此页面上拖动某些内容,并查看光标的变化。 - lc.
@lc。哦,是啊。奇怪的自然。我必须记住这个UX“模式”。 - J. Steen
1个回答

8

正确的做法不是根据时间触发,而是当用户移动鼠标足够多时触发。在 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
                //...
            }
        }
    }

1
也许使用 SystemInformation.DragSize 会是更好的选择。 - Stefan Egli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接