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

Posted

技术标签:

【中文标题】如何允许用户在他选择的位置拖动动态创建的控件【英文标题】:How to allow user to drag a dynamically created control at the location of his choice 【发布时间】:2011-04-21 14:26:47 【问题描述】:

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

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

我们可以在winforms中有这样的功能吗

【问题讨论】:

是的,但你需要努力工作。 @SLaks:你能指导我一下吗?我可以根据需要提供尽可能多的时间。我在工作中解决了这个问题,但我们说服了我们的客户是不可能的。但我知道这是可能的,所以我想在家里做。请让我知道从哪里开始。 【参考方案1】:

我创建了一个简单的表单来演示如何通过拖动控件来移动控件。 该示例假定在附加到相关事件处理程序的表单上有一个名为 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;

【讨论】:

为什么按钮,我将此代码添加为面板的功能,但它不起作用 该按钮只是用来添加文本框和设置事件。您也可以在表单加载时执行此操作。【参考方案2】:

这是最简单的方法:首先转到您的解决方案名称并右键单击。选择“管理 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)并写一个逗号。然后写它是否可拖动(true)或不可拖动(false)。

注意:不要忘记输入分号。

希望对你有帮助。

链接:https://www.nuget.org/packages/Control.Draggable/

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

我可以看到面板和按钮控制事件。他们没有 DoDragDrop 事件/属性。我是否必须将 AllowDrop 设置为 true。 是的;您需要在容器上设置AllowDropDoDragDrop 是一个方法,如果鼠标移到 SystemInformation.DragSize 之外,您需要在 MouseDown 之后立即调用 MouseMove。 在此处查看示例:msdn.microsoft.com/en-us/library/… 谢谢帮助,很快我就会开始在堆栈上发布很多问题,我想,:)

以上是关于如何允许用户在他选择的位置拖动动态创建的控件的主要内容,如果未能解决你的问题,请参考以下文章

如何根据用户查询数据在视图中设置动态“位置”?

wpf如何根据输入信息动态生成treeview

保存并加载动态创建的可拖动元素的位置(jQuery-UI)

C# webform中如何做到允许用户自由拖动控件-比如文本框到新的位置,并保存,下次用户使用的时候还可以恢复

VC 怎么动态改变控件大小

labview控件无法移动对象