C# WinForms 用鼠标拖动控件

Posted

技术标签:

【中文标题】C# WinForms 用鼠标拖动控件【英文标题】:C# WinForms dragging controls with mouse 【发布时间】:2011-06-22 11:45:07 【问题描述】:

我正在使用 WinForms 在 C# 中制作日历。 我用一个二维的面板数组把它放在一起,在它们里面我有一个代表约会的自定义控件的 List。

用户需要能够将约会控件从一个面板拖到另一个面板(每天)。

自定义控件有一个MouseDown和MouseUp事件,将消息从控件向上传递到Parent.Parent(自定义控件->天面板->日历窗体),并分别调用公共方法StartDragging()和StopDragging() .

在这些方法中,我复制了自定义控件并将其添加到窗体中,并将​​其存储在窗体中的一个名为 DraggedControl 的全局变量中。

Form 有一个 MouseMove 事件处理程序,如下所示:

    void Calendar_MouseMove(object sender, MouseEventArgs e)
    
        if (DraggedControl == null)
            return;

        DraggedControl.Location = PointToClient(MousePosition);
        Refresh();
    

但是有两个问题:

首先,自定义控件位于其他所有控件之下。我可以看到它在 MouseDown 和 MouseUp 上被添加和删除,但它被添加到面板和日期标签下的 0,0。 其次,它似乎根本没有随着 MouseMove 移动。我有一种感觉,这可能是因为我在按下按钮的同时移动鼠标,这将代表拖动操作而不是基本的 MouseMove。

如果我删除 MouseUp 代码,控件确实会用鼠标拖动,但是一旦鼠标进入面板(遗憾的是,该控件位于下方),拖动动作就会停止。

你会建议我做什么? 我怀疑可能有更好的方法来做我想做的事情。

【问题讨论】:

【参考方案1】:

自定义控件在一切之下 否则

把它放在首位:

DraggedControl.BringToFront();

它似乎没有移动 鼠标移动

处理MouseDown 事件的Control 捕获鼠标输入并接收所有随后的MouseMove 事件,直到它在MouseUp 事件上释放鼠标输入,这就是不调用Calendar_MouseMove() 的原因。为同一控件处理MouseMove 事件,该事件生成MouseDown 事件。

【讨论】:

以上是关于C# WinForms 用鼠标拖动控件的主要内容,如果未能解决你的问题,请参考以下文章

C# VS2010 进行WinForm程序开发,在设计时期,控件无法用鼠标拖动,只能用键盘调整位置。

C#设置一个控件可以鼠标拖动

WPF C#如何使用鼠标使控件可拖动

在 C# 中通过鼠标拖动来移动控件

C# wpf 实现任意控件拖动

C#怎么才能实现拖动控件时窗体也跟着移动