Перемещение элементов управления при перетаскивании на панели в C#
Я хочу перетащить элементы управления на панель, и при перетаскивании я хочу переместить элемент управления и получить его местоположение на панель. Я пробовал mouseUp, mouseDown, MouseMove события управления.Но это не то, что я ищу. Я хочу запустить событие DragDrop на панели и переместить управление. Могу я это сделать? Если вы можете дать мне идею, это будет здорово. Ниже приведена часть моего кода. Пожалуйста, поправьте меня. Большое спасибо.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace DragnDrop
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
Control mycontrol;
int x, y;
//Form1 f = new Form1();
private void Form1_Load(object sender, EventArgs e)
{
foreach (Control c in this.panel1.Controls)
{
c.MouseMove += new MouseEventHandler(lblDragger_MouseMove);
c.MouseUp += new MouseEventHandler(lblDragger_MouseUp);
c.MouseDown += new MouseEventHandler(pictureBox1_MouseDown);
c.MouseDoubleClick += new MouseEventHandler(pictureBox1_MouseDown);
}
panel2.AllowDrop = true;
foreach (Control c in this.panel2.Controls)
{
c.MouseDown += new MouseEventHandler(pictureBox1_MouseDown);
}
panel2.DragOver += new DragEventHandler(panel2_DragOver);
panel2.DragDrop += new DragEventHandler(panel2_DragDrop);
}
bool isDragging ;
int clickOffsetX ;
int clickOffsetY ;
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
// this.Cursor = Cursors.SizeAll;
//pictureBox1 = (PictureBox)sender;
Control c = sender as Control;
//DoDragDrop(pictureBox1.Image, DragDropEffects.Copy);
// validation = true;
isDragging = true;
clickOffsetX = e.X;
clickOffsetY = e.Y;
// c.DoDragDrop(c, DragDropEffects.Move);
}
private void lblDragger_MouseUp(System.Object sender, System.Windows.Forms.MouseEventArgs e)
{
isDragging = false;
}
private void panel2_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(typeof(Bitmap)))
{
e.Effect = DragDropEffects.Copy;
}
else
{
e.Effect = DragDropEffects.None;
}
}
private void panel2_DragOver(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.Move;
}
private void panel2_DragDrop(object sender, DragEventArgs e)
{
Control c = e.Data.GetData(e.Data.GetFormats()[0]) as Control;
mycontrol = c;
if (c != null)
{
c.Location = this.panel2.PointToClient(new Point(e.X, e.Y));
this.panel2.Controls.Add(c);
}
}
private void lblDragger_MouseMove(System.Object sender,
System.Windows.Forms.MouseEventArgs e)
{
Control c = sender as Control;
// bool isDragging = true;
if (isDragging == true)
{
c.Left = e.X + c.Left - clickOffsetX;
c.Top = e.Y + c.Top - clickOffsetY;
}
}
private void panel1_MouseLeave(object sender, EventArgs e)
{
Control c = sender as Control;
c.DoDragDrop(c, DragDropEffects.Move);
}
}
}
2 ответов
Если ваш элемент управления уже находится на панели, и вы просто перемещаете его в той же панели, то использование событий мыши, вероятно, самый простой способ сделать это. Я понимаю, что перетаскивание-это больше передача данных между элементами управления или даже приложениями. Перетаскивание было бы хорошо, если вы пытаетесь разрешить передачу элемента управления между панелями, например.
Если вы хотите сделать так, то вот один из возможных идея:
выполните перемещение перетаскивания внутри той же панели с помощью событий мыши.
когда вы получаете событие MouseLeave на панели, начните операцию DragDrop (некоторые примеры здесь) вы можете либо удалить элемент управления с панели, либо добавить какой-то эффект "серого", чтобы указать, что элемент управления может уходить.
отрегулируйте DragDrop на целевой панели и поместите элемент управления на мышь место падения.
Это сочетает в себе интуитивное ощущение перетаскивания элемента управления вокруг, а также предоставляет способ перетащить "мимо" панели и на новую поверхность.
вам нужно будет использовать мышь вверх и мыши вниз события, чтобы переключить состояние перетаскивания. Когда вы идете мышь вниз, вы начинаете перетаскивать. Вы записываете относительное положение мыши в элементе управления и относительное положение элемента управления в панели. Затем вы следуете за мышью, когда она перемещается, и перемещаете верхнюю и левую часть элемента управления относительно исходного местоположения мыши в вашем элементе управления.