【问题标题】:C# Drag and Drop functionalityC# 拖放功能
【发布时间】:2010-06-30 14:16:19
【问题描述】:

我正在尝试实现类似于 winzip/winrar 等的功能。我有一个 Treeview,它显示了一个包 (System.IO.Packaging) 的内容。我希望能够将文件或文件夹从TreeView 拖放到资源管理器窗口或桌面等。我的问题是我必须先调用DoDragDrop,然后才能知道对象是否真的被丢弃了。这意味着要使用FileDrop 类型创建DataObject,我必须将包的这些内容提取到一个临时区域,然后在调用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);

【问题讨论】:

    标签: c# drag-and-drop


    【解决方案1】:

    我已经尝试过使用类似于 FTP 服务器的应用程序进行此操作 - 我只想在用户实际删除项目后才开始下载。不幸的是,我发现仅使用托管代码无法做到这一点。

    WinZip 这样做的方式可能是通过接收 COM 回调(如果我在这里使用了错误的词,请原谅我)并且您必须围绕本机 COM 对象创建一个托管包装器才能自己接收此类回调.

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

    【讨论】:

    • 我在同一条船上,我最初承认并开始做嵌入式文件夹树,但这只是一个临时修复。不过,感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 2019-11-19
    相关资源
    最近更新 更多