- 标准的拖放流程
首先,需要在窗体上放置一个容器控件,比如Panel或者GroupBox,在这个容器控件上,就可以进行拖放了,具体的代码流程如下:
private void panel1_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(Button)))
e.Effect = DragDropEffects.Move;
else
e.Effect = DragDropEffects.None;
}
private void panel1_DragDrop(object sender, DragEventArgs e)
{
Button btn = e.Data.GetData(typeof(Button)) as Button;
if (btn != null)
{
this.panel1.Controls.Add(btn);
btn.Location = this.panel1.PointToClient(new Point(e.X, e.Y));
}
}
这里我们使用Panel作为容器控件,可以看到,当鼠标进入控件区域时,会触发DragEnter事件,我们可以在这个事件中判断拖入的数据类型是否为Button类型,如果是,则设置拖放效果为Move,否则为None;当鼠标放开时,会触发DragDrop事件,我们可以从数据中获取被拖动的控件,然后将其添加到容器中,设置其位置为鼠标放开的位置。
- 动态创建控件并实现拖放
除了容器控件,我们也可以动态创建控件,然后实现拖放,代码如下:
private void button1_MouseDown(object sender, MouseEventArgs e)
{
Button btn = new Button();
btn.Text = "New Button";
btn.Size = new System.Drawing.Size(80, 30);
btn.BackColor = Color.LightBlue;
btn.MouseDown += new MouseEventHandler(Button_MouseDown);
this.Controls.Add(btn);
btn.DoDragDrop(btn, DragDropEffects.Move);
}
private void Button_MouseDown(object sender, MouseEventArgs e)
{
Button btn = sender as Button;
if (e.Button == MouseButtons.Left)
btn.DoDragDrop(btn, DragDropEffects.Move);
}
private void panel1_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(Button)))
e.Effect = DragDropEffects.Move;
else
e.Effect = DragDropEffects.None;
}
private void panel1_DragDrop(object sender, DragEventArgs e)
{
Button btn = e.Data.GetData(typeof(Button)) as Button;
if (btn != null)
{
btn.Parent.Controls.Remove(btn);
this.panel1.Controls.Add(btn);
btn.Location = this.panel1.PointToClient(new Point(e.X, e.Y));
}
}
这里,我们在Button的MouseDown事件中添加了拖放事件,当鼠标按下后,会创建一个控件,并将其设置为数据源,然后进行拖放操作。在拖放目标容器的DragDrop事件中,同样可以获取到被拖动的控件,然后将其从原来的容器中移除,添加到拖放目标容器中。这里需要注意的是,添加控件的时候,需要将其Parent设置为目标容器。
以上是c#创建任意控件的拖动方法的核心代码,具体的实现方式可以根据需求进行扩展和变化。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#可以创建任意控件的拖动方法 - Python技术站