为什么在同一个元素上的mouseDown事件触发后双击事件才会触发?

ash*_*pal 11 .net vb.net

我在控件上有一个mousedown事件和click事件.mousedown事件用于启动拖放操作.我正在使用的控件是Dirlistbox.

 Private Sub Dir1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Dir1.MouseDown

    Dim lab As New Label
    lab.Text = Dir1.DirList(Dir1.DirListIndex)
    lab.DoDragDrop(lab, DragDropEffects.Copy)

End Sub
Run Code Online (Sandbox Code Playgroud)

但是当我点击控件然后只有mousedown事件触发时,click事件不会起火.如果我在mousedown事件中注释掉"lab.DoDragDrop(lab,DragDropEffects.Copy)",则click事件会触发.当我点击控件时,我能做什么才能使mousedown和click事件发生火灾?

Han*_*ant 23

这是设计的.MouseDown事件捕获鼠标Control.Capture属性.内置的MouseUp事件处理程序检查鼠标是否仍然被捕获并且鼠标没有移动太远,然后触发Click事件.麻烦的是调用DoDragDrop()将取消鼠标捕获.因为鼠标事件现在用于实现拖放操作,所以必然如此.因此,您永远不会获得Click和DoubleClick活动.

需要响应点击拖放的控件都是可用性问题.但是,它是可以修复的,您需要做的是确保用户已将鼠标从原始鼠标向下移动到足够的位置,然后开始拖动.使您的代码看起来像这样:

Private MouseDownPos As Point

Private Sub Dir1_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Dir1.MouseDown
    MouseDownPos = e.Location
End Sub

Private Sub Dir1_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Dir1.MouseMove
    If e.Button And MouseButtons.Left = MouseButtons.Left Then
        Dim dx = e.X - MouseDownPos.X
        Dim dy = e.Y - MouseDownPos.Y
        If Math.Abs(dx) >= SystemInformation.DoubleClickSize.Width OrElse _
           Math.Abs(dy) >= SystemInformation.DoubleClickSize.Height Then
            '' Start the drag here
            ''...
        End If
    End If
End Sub
Run Code Online (Sandbox Code Playgroud)