2017-09-25 68 views
0

我使用DragDrop.DoDragDrop将文件从我的C#WPF应用程序复制到Windows资源管理器。但是,实际复制文件会导致我的WPF应用程序冻结,直到复制完成。此复制操作可能会持续几秒到几分钟。如何使DragDrop.DoDragDrop异步?

DataObject dragdata = new DataObject(DataFormats.FileDrop); 
System.Collections.Specialized.StringCollection sc = new System.Collections.Specialized.StringCollection(); 

//fill the StringCollection with filenames 

dragdata.SetFileDropList(sc); 
DragDrop.DoDragDrop(listviewitem, dragdata, DragDropEffects.Copy); 

如何在不冻结/锁定我的应用程序的情况下调用DoDragDrop方法?我无法理解DataObject报告的“异步”实现。

+0

你的应用程序在哪里冻结?你释放鼠标吗?如果您希望有人能够帮助您,请提供问题的回购问题:https://stackoverflow.com/help/mcve – mm8

回答

-2

而不是试图使'DoDragDrop'方法异步执行,最好在不同的线程上执行文件复制,因为这样可以让运行WPF应用程序的UI的主线程继续在另一个线程执行复制文件的繁重I/O操作时运行(不冻结)。一旦另一个线程完成,您可以通知主线程它已完成显示一条状态消息,表示文件复制已完成。

+0

复制文件的繁重工作由Windows资源管理器处理,因此它超出了我的控制。 – Peter

+0

但是,如果您拖放拖动的文件时,您会编写代码以执行操作,就像在这种情况下,我相信您会编写代码来调用文件复制操作。 '私人无效StackPanel_Drop(对象发件人,DragEventArgs e) { //您的代码在调用方法来复制文件之前。 //复制文件的方法。 File.Copy(一些参数); }' – Khaimeng