【问题标题】:Why doesn't doubleclick event fire after mouseDown event on same element fires?为什么在同一元素上的 mouseDown 事件触发后双击事件不触发?
【发布时间】:2013-02-06 14:20:47
【问题描述】:

我在控件上有一个 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

但是当我点击控件时,只有 mousedown 事件触发,点击事件不会触发。 如果我在 mousedown 事件中注释掉“lab.DoDragDrop(lab, DragDropEffects.Copy)”,那么单击事件就会触发。 当我点击控件时,我该怎么做才能触发 mousedown 和 click 事件?

【问题讨论】:

  • 我认为Click 事件只有在您释放鼠标按钮而不将指针拖走时才会触发。这可能是您的问题。
  • 如果click 只触发而不将指针拖走,尝试改用MouseUp 吗?
  • @SysDragon 我也在做同样的事情,即使这样点击事件也不会触发。
  • @Pezzzz : 我尝试使用“Mouseup”事件,现在点击事件触发但我无法使用拖放操作。

标签: .net vb.net


【解决方案1】:

这是设计使然。 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

【讨论】:

  • 谢谢 - MouseDown --> MouseMove 解决方案相当明显,但我不知道 SystemInformation.DoubleClickSize 信息,所以这真的很有帮助:)
  • “需要响应点击和拖放的控件是一个可用性问题”。可能需要使用左键和右键单击来处理拖放操作。
【解决方案2】:

谁需要带有拖放功能的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);

                }
            }
        }
    }

【讨论】:

  • 我已经浪费了几天时间尝试不同读者的建议来解决这个问题,这是我发现的唯一一个真正有效的建议。谢谢!
  • 这不是对上述 VB 代码的翻译——并且包括对仅存在于您自己的程序中的对象 (dataGridView1) 的引用...
  • Jazimov,谁告诉你是翻译的。这是 C# 版本给你的想法,没有人会为你做你的工作。
猜你喜欢
  • 2022-12-06
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多