拖放的问题
本文关键字:问题 拖放 | 更新日期: 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*/)