C#拖放功能

时间:2010-06-30 14:16:19

标签: c# drag-and-drop

我正在尝试实现类似于winzip / winrar等的功能。我有Treeview显示包的内容(System.IO.Packaging)。我希望能够将文件或文件夹从TreeView拖放到资源管理器窗口或桌面等等。我的问题是我必须先调用DoDragDrop才知道对象是实际上甚至下降。这意味着要使用DataObject类型创建FileDrop,我必须将包的这些内容提取到临时区域,然后在调用DoDragDrop之前将该路径提供给DataObject。如果用户没有放下有能力的容器或取消丢弃,则浪费了提取这些内容的开销。我注意到winzip实际上并没有创建临时文件,直到在有效目标上发生丢弃。我检查了WinZip drop提供的DataFormats,它们是普通的FileDrop,FileNameW,FileName和Shell IDList Array。前三个只是将一个字符串保存到winzip提取该文件的临时位置。我不确定最后一个是做什么的。

长话短说,我希望能够避免提取内容,直到我知道丢弃位置有效。是否有回调来确定掉落位置?任何建议都会非常有用。

System.Windows.DragDropEffects de = DragDrop.DoDragDrop(treeview1, dataObj, System.Windows.DragDropEffects.Move);

1 个答案:

答案 0 :(得分:1)

我尝试使用类似于FTP服务器的应用程序 - 我想在用户实际删除项目后才开始下载。不幸的是,我发现只有使用托管代码才能做到这一点。

WinZip可能通过接收COM回调的方式(如果我在这里使用了错误的单词,请原谅我),你必须在本机COM对象周围创建一个托管包装器,以便自己接收这样的回调

这当然是可能的,但我放弃并在我的应用程序中嵌入了一个FolderTreeView,以便自己捕捉掉落事件:/