【问题标题】:C# drag n drop, start drag operation in mouse_down ? conflicts with clickC# 拖放,在 mouse_down 中开始拖动操作?与点击冲突
【发布时间】:2013-06-23 20:17:26
【问题描述】:

我有一个 C# WinForms 应用程序,其表单上有一个 GridView,它显示来自数据库的记录,其中包含存储在数据库中的 blob(文件 PDF/JPG/等)。

我可以双击网格中的一行,将 blob 写入磁盘并打开文件。 我可以单击行来选择一行或多行(使用 ctrl+shift) 我可以将文件拖到网格上以将文件作为行添加到网格(和数据库)

现在我希望用户能够将一行或多行从网格拖动到例如桌面或邮件客户端,但不知道在什么情况下开始“拖动”操作。

当用户选择一个或多个文件时,他/她使用鼠标左键执行此操作,拖动使用相同的鼠标左键,这两个事件都会触发鼠标按下事件。如何确定用户将要做什么?

我曾尝试在鼠标按下事件中启动拖动操作,但如果我想选择多行,这不起作用,每次单击一行时都会启动拖动操作...

例如,在 Windows 资源管理器中是如何处理的? 如何检测用户正在尝试做什么?

【问题讨论】:

  • 在 MouseDown 中你应该记下位置,然后当你在没有 MouseUp 的情况下得到 MouseMove 时,你可以计算移动的距离。如果鼠标移动超过一定距离(比如在 X 或 Y 方向上移动 12 个像素),则开始拖动。
  • Matthew 是对的,但是使用 SystemInformation.DragSize 属性 (msdn.microsoft.com/en-us/library/…) 而不是 12 像素

标签: c# winforms drag-and-drop


【解决方案1】:

我现在已经开始工作了。但是我没有按照建议使用计时器。

在 Mouse-Down 中我设置一个标志并存储 X,Y 点,然后在 mouse-up 中我重置标志并在 Mouse-move 中我根据存储的 X,Y poiny 计算移动,当移动超过 10 像素时X 或 Y 方向我开始拖动操作。

这是代码。

'

    private bool DraggingFromGrid = false;
    private System.Drawing.Point DraggingStartPoint = new System.Drawing.Point(  );

    void GridControlBrowser_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {
            DraggingFromGrid = true;
            DraggingStartPoint = new System.Drawing.Point(e.X, e.Y);
        }
    }

    void GridControlBrowser_MouseUp(object sender, MouseEventArgs e)
    {
        if (DraggingFromGrid)
        {
            DraggingFromGrid = false;
        }
    }

    void GridControlBrowser_MouseMove(object sender, MouseEventArgs e)
    {
        if (DraggingFromGrid)
        {
            if (System.Math.Abs(e.X - DraggingStartPoint.X) > 10 ||
                System.Math.Abs(e.Y - DraggingStartPoint.Y) > 10)
            {
                StartDragging();
            }
        }
    }

    private void StartDragging()
    {
        DraggingFromGrid = false;

        // create files
        var _criteria = this.GetSelectionFromGrid();
        var _files = new List<string>();

        ... retrieve filenames and store in _files List ...

        var _data = new DataObject(DataFormats.FileDrop, _files.ToArray());

        DoDragDrop(_data, DragDropEffects.Copy);
    }

'

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,即向表单添加拖动会干扰现有的双击功能。我找到了一个非常简单的解决方案:

    void GridControlBrowser_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    {
        if (e.Clicks != 2)
        {
            StartDragging();
        }
    }
    

    如果有双击,这将取消拖动,以便双击继续工作。

    【讨论】:

      【解决方案3】:

      有不止一种方法可以做到这一点。我强烈建议您尝试其中的一些,直到您决定什么最适合您。例如,您可以使用 mouse_down 事件通过计时器开始拖放。如果用户单击鼠标超过 0.5 秒,则开始拖动。 mouse_up 事件终止拖放。 另一种方法是仅在单击鼠标时按下某个键来进行拖放。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-21
        • 1970-01-01
        • 2016-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多