C# WinForms鼠标拖动控件

3
我正在使用WinForms和C#制作一个日历。我使用了一个二维Panel数组,并在其中放置了一个自定义控件列表,这些控件代表预约。
用户需要能够将预约控件从一个Panel拖到另一个Panel(从一天到另一天)。
自定义控件有MouseDown和MouseUp事件,它们会将消息从控件传递到Parent.Parent(自定义控件->日面板->日历窗体),并分别调用公共方法StartDragging()和StopDragging()。
在这些方法中,我克隆自定义控件并将其添加到窗体中,并将其存储在窗体的全局变量DraggedControl中。
窗体有一个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个回答

2

自定义控件位于其他所有内容之下。

将其置于顶层:

DraggedControl.BringToFront();

看起来它根本没有随着MouseMove移动

处理MouseDown事件的控件捕获鼠标输入,并接收所有随后的MouseMove事件,直到它在MouseUp事件上释放鼠标输入,这就是为什么Calendar_MouseMove()不会被调用。为了解决这个问题,需要为生成MouseDown事件的同一控件处理MouseMove事件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接