拖放的问题

本文关键字:问题 拖放 | 更新日期: 2023-09-27 18:12:10

我使用以下代码将文件拖放到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;
}

拖放的问题

您可以使用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的文件

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

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