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

时间:2010-10-06 01:32:26

标签: c# winforms controls draggable

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

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

我们可以在winforms中使用此类功能

3 个答案:

答案 0 :(得分:22)

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

答案 1 :(得分:1)

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

如果您希望在拖动时看到控件,您可以在鼠标下方显示控件(调用WM_NCHITTEST),或者不使用拖放操作来制作透明(句柄DrawToBitmap)表单完全处理鼠标事件并手动跟踪状态。

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

答案 2 :(得分:1)

这是最简单的方法:首先转到您的解决方案名称并右键单击。选择"管理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)。

注意:不要忘记加分号。

希望它有所帮助。

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