سلام
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace WindowsFormsApp16
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
button1.Draggable(true);
checkBox1.Draggable(true);
}
}
public static class ControlExtension
{
// TKey is control to drag, TValue is a flag used while dragging
private static Dictionary<Control, bool> draggables =
new Dictionary<Control, bool>();
private static System.Drawing.Size mouseOffset;
public static void Draggable(this Control control, bool Enable)
{
if (Enable)
{
// enable drag feature
if (draggables.ContainsKey(control))
{ // return if control is already draggable
return;
}
// 'false' - initial state is 'not dragging'
draggables.Add(control, false);
// assign required event handlersnnn
control.MouseDown += new MouseEventHandler(control_MouseDown);
control.MouseUp += new MouseEventHandler(control_MouseUp);
control.MouseMove += new MouseEventHandler(control_MouseMove);
}
else
{
// disable drag feature
if (!draggables.ContainsKey(control))
{ // return if control is not draggable
return;
}
// remove event handlers
control.MouseDown -= control_MouseDown;
control.MouseUp -= control_MouseUp;
control.MouseMove -= control_MouseMove;
draggables.Remove(control);
}
}
static void control_MouseDown(object sender, MouseEventArgs e)
{
mouseOffset = new System.Drawing.Size(e.Location);
// turning on dragging
draggables[(Control)sender] = true;
}
static void control_MouseUp(object sender, MouseEventArgs e)
{
// turning off dragging
draggables[(Control)sender] = false;
}
static void control_MouseMove(object sender, MouseEventArgs e)
{
// only if dragging is turned on
if (draggables[(Control)sender] == true)
{
// calculations of control's new position
System.Drawing.Point newLocationOffset = e.Location - mouseOffset;
((Control)sender).Left += newLocationOffset.X;
((Control)sender).Top += newLocationOffset.Y;
}
}
}
}
خطوط 81-21 کار اصلی رو انجام میده. من دو کنترل button و checkBox رو روی فرم قرار دادم و توی رویداد Load فرم هم با فراخوانی متد ()Draggable ، کنترل ها این قابلیت روپیدا می کنن که بشه Drag & Drop بشن