.net 为什么';在相同元素激发的mouseDown事件之后,是否双击事件激发?
我有一个mousedown事件并单击控件上的事件。mousedown事件用于启动dragdrop操作。我使用的控件是Dirlistbox.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
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信息非常有用:)“需要响应单击和拖放的控件都是可用性问题”。人们可能想用左键和右键点击来处理拖放。我已经浪费了好几天时间尝试不同读者的建议来解决这个问题,这是我发现唯一一个真正有效的方法。非常感谢。