.net 在 C# 中的面板上拖放时移动控件

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/2439061/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-03 14:04:32  来源:igfitidea点击:

Move controls when Drag and drop on panel in C#

.netwinformsdrag-and-droppanel

提问by Dinu

I want to drag controls on panel and when dragging I want to move the control and get its location to drop on to panel. I have tried out mouseUp, mouseDown, MouseMove events of control.But that is not what I am looking for. I want to fire DragDrop event on panel and move control. Can I do this? If you can give me an idea it will be great. Below is part of my code. Please correct me. Thanks a lot.

我想在面板上拖动控件,拖动时我想移动控件并将其位置放到面板上。我已经尝试过 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); 
        }
    }
}

采纳答案by Dan Bryant

If your control is already on the panel and you're simply moving it within the same panel, then using the Mouse events is probably the easiest way to do this. My understanding is that Drag and Drop is more about conveying data between controls or even applications. Drag and drop would be a good fit if you're trying to allow a control to transfer between panels, for example.

如果您的控件已经在面板上并且您只是在同一面板内移动它,那么使用鼠标事件可能是最简单的方法。我的理解是,拖放更多的是在控件甚至应用程序之间传送数据。例如,如果您试图允许控件在面板之间传输,则拖放将是一个不错的选择。



If you want to do both, then here's one possible idea:

如果你想同时做这两个,那么这里有一个可能的想法:

  1. Perform move dragging within the same panel using your Mouse events.

  2. When you get a MouseLeave event on the panel, begin a DragDrop operation (some examples here) You can either remove the control from the panel or add some sort of 'gray out' effect to indicate that the control may be leaving.

  3. Handle the DragDrop on your target panel and place the control at the mouse location of the drop.

  1. 使用鼠标事件在同一面板内执行移动拖动。

  2. 当您在面板上获得一个 MouseLeave 事件时,开始一个 DragDrop 操作(这里有一些示例) 您可以从面板中删除控件或添加某种“灰色”效果以指示控件可能正在离开。

  3. 处理目标面板上的 DragDrop 并将控件放置在拖放的鼠标位置。

This combines the intuitive feel of dragging the control around, while also providing a way to drag 'past' the panel and on to a new surface.

这结合了拖动控件的直观感觉,同时还提供了一种将“经过”面板拖到新表面上的方法。

回答by Payton Byrd

You will need to use the mouse up and mouse down events to toggle your drag state. When you go mouse down, you start dragging. You record the relative position of the mouse within your control and the relative position of your control within the panel. You then follow the mouse as it moves and repositioning the control's top and left relative to the original location of the mouse within your control.

您将需要使用鼠标向上和鼠标向下事件来切换拖动状态。当你放下鼠标时,你开始拖动。您可以记录鼠标在控件中的相对位置以及控件在面板中的相对位置。然后随着鼠标移动并相对于控件内鼠标的原始位置重新定位控件的顶部和左侧。