2

我的问题如下:我有一个名为 secretImage 的位图。现在用户可以将图像从他们的桌面拖到面板上,并且图像存储在位图中。

这是我迄今为止尝试过的:

bitmap secretImage;

private void pnlImage_DragEnter(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent(DataFormats.Bitmap))
        {
            e.Effect = DragDropEffects.Copy;
        }
        else
        {
            e.Effect = DragDropEffects.None;
        }

    }

    private void pnlImage_DragDrop(object sender, DragEventArgs e)
    {
        secretImage = (Bitmap)e.Data.GetData(DataFormats.Bitmap);
        pnlImage.BackgroundImage = secretImage;
    }

问题是效果甚至没有显示出来。因此,我猜想图像(即 *.bmp)在某种程度上不是 DataFormats.Bitmap。也许我的方法是完全错误的,我更像是 C# 的初学者。

谢谢你的任何答案。

4

1 回答 1

2

我认为你真正需要的是:

    private delegate void DragDropDelegate(String[] s);

    private void pnlImage_DragEnter(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent(DataFormats.FileDrop))
        {
            e.Effect = DragDropEffects.Copy;
        }
        else
        {
            e.Effect = DragDropEffects.None;
        }
    }

    private void pnlImage_DragDrop(object sender, DragEventArgs e)
    {
        try
        {
            String[] a = (String[])e.Data.GetData(DataFormats.FileDrop);

            if (a != null)
            {
                this.BeginInvoke(new DragDropDelegate(DelegateDragDrop), new Object[] { a });
                this.Activate(); // This avoids some odd behaviour
            }
        }
        catch (Exception ex)
        {
            Trace.WriteLine("Error in DragDrop function: " + ex.Message);
        }
    }

    private void DelegateDragDrop(String[] files)
    {
        // Verify file formats and do something with the files.

    }

由于并非所有图像都是位图,因此它不会始终与 DataFormats.Bitmap 一起使用,因此最好换一种方式使用 FileDrop,因为它包含所有拖动文件,更具体地说是事件中的文件路径。

调用委托是为了防止在处理文件时阻塞资源管理器,它还避免了跨线程问题。

于 2013-06-10T14:06:49.763 回答