Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 为什么';在相同元素激发的mouseDown事件之后,是否双击事件激发?_.net_Vb.net - Fatal编程技术网

.net 为什么';在相同元素激发的mouseDown事件之后,是否双击事件激发?

.net 为什么';在相同元素激发的mouseDown事件之后,是否双击事件激发?,.net,vb.net,.net,Vb.net,我有一个mousedown事件并单击控件上的事件。mousedown事件用于启动dragdrop操作。我使用的控件是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.DirLi

我有一个mousedown事件并单击控件上的事件。mousedown事件用于启动dragdrop操作。我使用的控件是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
但是当我单击控件时,只有mousedown事件触发,而click事件不会触发。 如果我在mousedown事件中注释掉“lab.DoDragDrop(lab,dragdropefects.Copy)”,然后单击event gets fire。
当我单击控件时,如何才能使mousedown和click事件都触发?

这是出于设计。MouseDown事件捕获鼠标Control.Capture属性。内置的MouseUp事件处理程序检查鼠标是否仍然被捕获,并且鼠标是否移动得太远,然后触发Click事件。问题是调用DoDragDrop()将取消鼠标捕获。这是必然的,因为现在使用鼠标事件来实现拖放操作。因此,您将永远无法获得单击或双击事件


同时需要响应单击和拖放的控件是一个可用性问题。但是,它是可修复的,您需要做的是确保用户已将鼠标从原始鼠标向下位置移动足够多,然后开始拖动。使您的代码如下所示:

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
谁需要带拖放功能的c#版本

    private Point MouseDownPos;
    private void dataGridView1_MouseDown(System.Object sender, System.Windows.Forms.MouseEventArgs e)
    {
        MouseDownPos = e.Location;
    }

    private void dataGridView1_MouseMove(System.Object sender, System.Windows.Forms.MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            dynamic dx = e.X - MouseDownPos.X;
            dynamic dy = e.Y - MouseDownPos.Y;
            if (Math.Abs(dx) >= SystemInformation.DoubleClickSize.Width || Math.Abs(dy) >= SystemInformation.DoubleClickSize.Height)
            {
                DataGridView.HitTestInfo info = dataGridView1.HitTest(e.X, e.Y);
                if (info.RowIndex >= 0)
                {
                    DataRowView view = (DataRowView)
                           dataGridView1.Rows[info.RowIndex].DataBoundItem;

                    if (view != null)
                        dataGridView1.DoDragDrop(view, DragDropEffects.Move);

                }
            }
        }
    }

我认为
单击
事件只会在您释放鼠标按钮而不拖动指针的情况下触发。这可能是您的问题。如果
click
仅在不将指针拖走的情况下激发,请尝试使用
MouseUp
代替?@SysDragon我正在做同样的事情,即使单击事件没有激发。@pezzz:我尝试使用“MouseUp”事件,现在单击事件触发,但我无法使用dragdrop操作。谢谢-MouseDown-->MouseMove解决方案相当明显,但我不知道系统信息。DoubleClickSize信息非常有用:)“需要响应单击和拖放的控件都是可用性问题”。人们可能想用左键和右键点击来处理拖放。我已经浪费了好几天时间尝试不同读者的建议来解决这个问题,这是我发现唯一一个真正有效的方法。非常感谢。