拖放问题

时间:2013-05-04 10:29:48

标签: c# winforms drag-and-drop

我使用以下代码将文件拖放到c#winforms应用程序中。我遇到的问题是DragDrop事件处理程序需要一段时间,在此期间我无法使用拖动文件的窗口。如何解决这个问题?

private void FormMain_DragDrop(object sender, DragEventArgs e)
{
    string[] s = (string[])e.Data.GetData(DataFormats.FileDrop, false);
    // do some long operation
}

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

2 个答案:

答案 0 :(得分:1)

您可以使用BackgroundWorker在不同的主题中执行所需的操作,如下所示:

    BackgroundWorker bgw;

    public Form1()
    {
        InitializeComponent();
        bgw = new BackgroundWorker();
        bgw.DoWork += bgw_DoWork;
    }

    private void Form1_DragDrop(object sender, DragEventArgs e)
    {
        if (e.Data.GetDataPresent(DataFormats.FileDrop))
        {
            string[] s = (string[])e.Data.GetData(DataFormats.FileDrop, false);
            bgw.RunWorkerAsync(s);
        }

    }

同样针对您的“跨线程操作”问题,尝试使用Invoke方法,如下所示:

    void bgw_DoWork(object sender, DoWorkEventArgs e)
    {
        Invoke(new Action<object>((args) =>
        {
            string[] files = (string[])args;

        }), e.Argument);
    }

最好使用上面的GetDataPresent检查已删除的项目是否为文件。

答案 1 :(得分:0)

如果不是ui密集型操作,可以使用后台线程进行长时间运行。

ThreadPool.QueueUserWorkItem((o) => /* long running operation*/)