我正在创建一个应用程序,我需要生成动态创建的控件,例如文本框或标签等。
现在我该用户可以将该文本框重新定位到他想要的位置。就像我们在Visual Studio中一样。 一种方法是通过使用文本框从他那里获取值来获得新位置。但我希望用户界面容易。
我们可以在winforms中使用此类功能
答案 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)。
注意:不要忘记加分号。
希望它有所帮助。