Переместить элементы управления, когда перетаскивание на панели в C # - PullRequest
10 голосов
/ 13 марта 2010

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

9 голосов
/ 13 марта 2010

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


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

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

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

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

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

1 голос
/ 13 марта 2010

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

...