如何允许用户在他选择的位置拖动动态创建的控件

我正在创建一个应用程序,我需要生成动态创建的控件,如文本框或标签等。

现在我该用户可以将该文本框重新定位到他想要的位置。 就像我们在Visual Studio中一样。 一种方法是通过使用文本框从他那里获取值来获得新位置。 但我希望用户界面容易。

我们能否在winforms中拥有此类function

我创建了一个简单的表单,演示如何通过拖动控件来移动控件。 该示例假定在附加到相关事件处理程序的表单上有一个名为button1的按钮。

private Control activeControl; private Point previousLocation; private void button1_Click(object sender, EventArgs e) { var textbox = new TextBox(); textbox.Location = new Point(50, 50); textbox.MouseDown += new MouseEventHandler(textbox_MouseDown); textbox.MouseMove += new MouseEventHandler(textbox_MouseMove); textbox.MouseUp += new MouseEventHandler(textbox_MouseUp); this.Controls.Add(textbox); } void textbox_MouseDown(object sender, MouseEventArgs e) { activeControl = sender as Control; previousLocation = e.Location; Cursor = Cursors.Hand; } void textbox_MouseMove(object sender, MouseEventArgs e) { if (activeControl == null || activeControl != sender) return; var location = activeControl.Location; location.Offset(e.Location.X - previousLocation.X, e.Location.Y - previousLocation.Y); activeControl.Location = location; } void textbox_MouseUp(object sender, MouseEventArgs e) { activeControl = null; Cursor = Cursors.Default; } 

您可以使用包含或表示控件的数据对象调用DoDragDrop以开始拖放操作,然后处理容器的DragDrop事件并移动控件。

如果你想在拖动时看到控件,你可以在鼠标下显示控件(调用DrawToBitmap )的透明(句柄WM_NCHITTEST )表单,或者根本不使用拖放操作,而是手动处理鼠标事件和跟踪状态。

如果需要Visual Studio样式的捕捉线,可以将控件的边界与其他控件进行比较,绘制一组线条,然后在绘制事件中绘制它们。

这是最简单的方法:首先转到您的解决方案名称并右键单击。 选择“管理NuGet包”。 过了一会儿,窗口打开,顶部有一个搜索栏。 选择“浏览选项”并搜索DraggableControl包。 必须看到名称Control.Draggable。 单击它然后单击“安装”。 现在您可以使用它的特殊命令。

  private void button1_Click(object sender, EventArgs e) { Point p = new Point(20,70 * i); RichTextBox tb = new RichTextBox(); tb.Location = p; tb.Height= 60; tb.Width = 100; tb.Font = Normal; ControlExtension.Draggable(tb,true); this.Controls.Add(tb); i++; 

ControlExtension.Draggable命令可以将其设置为可拖动。 只需在括号中写出对象的名称(对我来说是tb)并写一个逗号。 然后写它是draggable(true)或不是(false)。

注意:不要忘记加分号。

希望能帮助到你。