Перемещение элементов управления при перетаскивании на панели в С#

Я хочу перетащить элементы управления на панель, и при перетаскивании я хочу переместить элемент управления и получить его местоположение для перехода на панель. Я пробовал 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); 
        }
    }
}

Ответ 1

Если ваш элемент управления уже находится на панели, и вы просто перемещаете его в пределах одной панели, то использование событий мыши - это, вероятно, самый простой способ сделать это. Я понимаю, что Drag and Drop больше касается передачи данных между элементами управления или даже приложениями. Например, перетаскивание будет подходящим, если вы хотите, чтобы управление передавалось между панелями, например.


Если вы хотите сделать то и другое, то вот одна возможная идея:

  • Выполните перетаскивание перемещения на одной панели с помощью событий мыши.

  • Когда вы получаете событие MouseLeave на панели, начните операцию DragDrop (некоторые примеры здесь). Вы можете либо удалить элемент управления от панели или добавить какой-то эффект "серого", чтобы указать, что элемент управления может уходить.

  • Обращайтесь к DragDrop на целевой панели и поместите элемент управления в положение мыши для удаления.

Это сочетает в себе интуитивное ощущение перетаскивания элемента управления, а также способ перетащить панель "назад" и перейти на новую поверхность.

Ответ 2

Для переключения состояния перетаскивания вам нужно будет использовать мыши и мыши. Когда вы нажимаете мышь, вы начинаете перетаскивать. Вы записываете относительное положение мыши внутри вашего элемента управления и относительное положение вашего элемента управления внутри панели. Затем вы следуете за мышью, когда она перемещается и перемещает верхнюю и верхнюю части управления относительно исходного местоположения мыши внутри вашего элемента управления.