C#从一个图片框拖放到另一个图片框中

时间:2013-04-14 21:42:53

标签: c# drag-and-drop picturebox

我正在使用C#在visual studio 2012中工作,我需要将一个图片框拖到另一个图片框中,基本上用拖动图片框图像替换目标图片框图像。

我该怎么做?

请具体并尝试尽可能简单地解释。 我对编程非常陌生,有点绝望所以请耐心等待我。

4 个答案:

答案 0 :(得分:10)

Drag + drop隐藏在PictureBox控件上。不知道为什么,它工作得很好。这里可能的指导是,用户不会明白您可以将图像放在控件上。你必须对此做些什么,至少将BackColor属性设置为非默认值,以便用户可以看到它。

Anyhoo,你需要在第一个图片框上实现MouseDown事件,这样你就可以点击它并开始拖动:

    private void pictureBox1_MouseDown(object sender, MouseEventArgs e) {
        var img = pictureBox1.Image;
        if (img == null) return;
        if (DoDragDrop(img, DragDropEffects.Move) == DragDropEffects.Move) {
            pictureBox1.Image = null;
        }
    }

我假设您想要移动图像,如果需要复制,必要时进行调整。然后,您将必须在第二个图片框上实现DragEnter和DragDrop事件。由于属性是隐藏的,您应该在窗体的构造函数中设置它们。像这样:

    public Form1() {
        InitializeComponent();
        pictureBox1.MouseDown += pictureBox1_MouseDown;
        pictureBox2.AllowDrop = true;
        pictureBox2.DragEnter += pictureBox2_DragEnter;
        pictureBox2.DragDrop += pictureBox2_DragDrop;
    }

    void pictureBox2_DragEnter(object sender, DragEventArgs e) {
        if (e.Data.GetDataPresent(DataFormats.Bitmap))
            e.Effect = DragDropEffects.Move;
    }

    void pictureBox2_DragDrop(object sender, DragEventArgs e) {
        var bmp = (Bitmap)e.Data.GetData(DataFormats.Bitmap);
        pictureBox2.Image = bmp;
    }

这允许您将图像从另一个应用程序拖到框中。我们称之为功能。如果你想禁用它,请使用bool标志。

答案 1 :(得分:1)

您可以使用鼠标进入和离开事件来轻松完成此操作。例如,您有两个图片框pictureBox1和pictureBox2 ...并且您想要从图片框1拖动图像并将其放到图片框2上做这样的事情...

 private void pictureBox2_MouseUp(object sender, MouseEventArgs e)
    {
        if (a == 1)
        {
            pictureBox1.Image = pictureBox2.Image;
            a = 0;
        }
    }

    private void pictureBox1_MouseEnter(object sender, EventArgs e)
    {
        a = 1;
    }

其中'a'只是一个锁或键,用于检查鼠标是否已进入我们想要放置此图像的控件...希望它有帮助......为我工作

答案 2 :(得分:0)

Hans的回答使我找到了正确的解决方案。该答案的问题在于将DoDragDrop放在MouseDown内将阻止MouseClick事件的触发。

这是我的解决方法:

private void PictureBox_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        var pb = (PictureBox)sender;
        if (pb.BackgroundImage != null)
        {
            pb.DoDragDrop(pb, DragDropEffects.Move);
        }
    }
}

private void PictureBox_DragEnter (object sender, DragEventArgs e)
{
    e.Effect = DragDropEffects.Move;
}

private void PictureBox_DragDrop (object sender, DragEventArgs e)
{
    var target = (PictureBox)sender;
    if (e.Data.GetDataPresent(typeof(PictureBox)))
    {
        var source = (PictureBox)e.Data.GetData(typeof(PictureBox));
        if (source != target)
        {
            // You can swap the images out, replace the target image, etc.
            SwapImages(source, target);
        }
    }
}

我的GitHub上的完整示例。

答案 3 :(得分:0)

  1. 您不能在 PictureBox 上设置 AllowDrop...为整个表单设置它。

代码片段

Form1.AllowDrop = true;

  1. 使用 Form DragEnter、DragDrop 事件,即使您将其放在图片框上,它们也会起作用。

private void Form1_DragEnter(object sender, DragEventArgs e)

{

e.Effect = DragDropEffects.Move;

}

private void Form1_DragDrop(object sender, DragEventArgs e)

{

int x = this.PointToClient(new Point(e.X, e.Y)).X;

int y = this.PointToClient(new Point(e.X, e.Y)).Y;

if(x >= pictureBox1.Location.X && x <= pictureBox1.Location.X + pictureBox1.Width && y >= pictureBox1.Location.Y && y <= pictureBox1.Location.Y + pictureBox1.Height)

{

    string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);

    pictureBox1.Image = Image.FromFile(files[0]);

}

}