Почему не срабатывает событие doubleclick event после события mouseDown на одном и том же элементе?
У меня есть событие mousedown и событие click на элементе управления. событие 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 не срабатывает.
Если я прокомментирую "lab.DoDragDrop(lab, DragDropEffects.Copy)" в событии mousedown, тогда щелчок события загорается.
что я могу сделать так, чтобы как mousedown, так и событие click загорелись, когда я нажимаю на элемент управления?
Ответы
Ответ 1
Это по дизайну. Событие MouseDown захватывает мышь, свойство Control.Capture. Встроенный обработчик событий MouseUp проверяет, все ли мышь захвачена, а мышь не зашла слишком далеко, а затем запускает событие Click. Проблема заключается в том, что вызов DoDragDrop() отменяет захват мыши. Обязательно, так как мышиные события теперь используются для реализации операции drag + drop. Таким образом, вы никогда не получите событие Click или DoubleClick.
Элементы управления, которые должны отвечать на клики, а drag + drop - проблема удобства использования. Тем не менее, это исправление, что вам нужно сделать, так это убедиться, что пользователь переместил мышью достаточно от исходного местоположения мыши, а затем начал перетаскивание. Сделайте свой код таким:
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
Ответ 2
для тех, кому нужна версия С# с перетаскиванием
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);
}
}
}
}