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 用鼠标拖动控件的主要内容,如果未能解决你的问题,请参考以下文章