2010-06-30 117 views
1

我試圖實現類似的winzip/WinRAR的功能性等我有一個Treeview顯示一個包(System.IO.Packaging程序)的內容。我希望能夠將一個文件或文件夾從TreeView拖放到資源管理器窗口或桌面等。我的問題是我必須先致電DoDragDrop,然後才能知道該對象是否實際上被丟棄。這意味着要創建類型爲FileDropDataObject,我必須將這些包的內容提取到臨時區域,然後在調用DoDragDrop之前將該路徑提供給DataObject。如果用戶沒有放在有能力的容器上或取消放置,則提取這些內容的開銷將被浪費。我注意到winzip實際上並不創建臨時文件,直到在有效目標上發生丟棄爲止。我檢查了WinZip提供的DataFormats,它們是普通的FileDrop,FileNameW,FileName和Shell IDList Array。前三個只是將字符串保存到winzip將該文件提取到的臨時位置。我不確定最後一個人會做什麼。長話短說,我希望能夠避免提取內容,直到我知道放置位置是有效的。是否有回調來確定放置位置?任何建議都會非常有幫助。C#拖放功能

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

回答

1

我已經試過這類似於一個FTP服務器上的應用 - 我想開始下載用戶只有經過實際下降的項目。不幸的是,我發現沒有辦法只使用託管代碼。

WinZip的做法可能是通過接收COM回調(請原諒我,如果我在這裏使用錯誤的話),你必須創建一個圍繞本機COM對象的託管包裝,以接收這樣的回調你自己。

這當然是可能的,但我放棄了,我的應用程序嵌入FolderTreeView的thingie趕丟棄事件自己:/

+0

我是在同一條船上,我首先承認,開始做嵌入式FolderTree還可以,但這只是一個臨時的解決方案。不過謝謝你的建議。 – 2010-06-30 14:55:14