2012-06-15 118 views
7

我試圖在我的WPF應用程序中實現功能,將圖像從瀏覽器拖出到我的WPF應用程序的窗口中。將圖像從瀏覽器拖放到WPF應用程序

該代碼適用於Firefox和Windows資源管理器,但Chrome和IE出現問題(尚未嘗試任何其他瀏覽器)。

這裏有一個代碼片段:

private void Drag_Enter(object sender, DragEventArgs e) 
{ 
    foreach (string format in e.Data.GetFormats()) 
     Console.WriteLine(format); 
    Console.WriteLine("Effects:" + e.AllowedEffects); 
} 

private void Drag_Drop(object sender, DragEventArgs e) 
{ 
    string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); 
    ImageSourceConverter converter = new ImageSourceConverter(); 
    foreach (string file in files) 
    { 
     if (converter.IsValid(file)) 
     { 
      // Do something with the image 
     } 
    } 
} 

望着輸出,似乎火狐圖像實際上保存到剪貼板,而Chrome瀏覽器就可以抓取圖片的HTML,而IE不會做任何事情。

任何人都對我如何獲得跨瀏覽器功能有一些瞭解?


更新: 我發現一對夫婦的解決方法是解析HTML(瀏覽器/火狐)的圖像源,然後使用類似WebClient的對象的來源下載。 然而,偏好一種方法對文件類型有更強的檢查。

IE9和Firefox都具有DeviceIndependentBitmap文件格式,該格式在拖動非超鏈接圖像時可用。這似乎是一個更安全的選擇,儘管Chrome似乎不支持它。它對超鏈接圖像也沒有那麼有用。


與Firefox,輸出(DRAG_ENTER由於某種原因被炒魷魚了兩次):再次

DragContext 
DragImageBits 
FileGroupDescriptorW 
FileContents 
HTML Format 
text/html 
text/x-moz-url 
UniformResourceLocatorW 
UniformResourceLocator 
Text 
UnicodeText 
System.String 
Effects: Copy, Move, Link 

的Internet Explorer(:

text/x-moz-url 
FileGroupDescriptor 
FileGroupDescriptorW 
FileContents 
UniformResourceLocator 
UniformResourceLocatorW 
text/x-moz-url-data 
text/x-moz-url-desc 
text/uri-list 
text/_moz_htmlcontext 
text/_moz_htmlinfo 
text/html 
HTML Format 
Text 
UnicodeText 
System.String 
application/x-moz-nativeimage 
DeviceIndependentBitmap 
FileDrop 
FileNameW 
FileName 
Preferred DropEffect 
application/x-moz-file-promise-url 
application/x-moz-file-promise-dest-filename 
DragImageBits 
DragContext 
Effects: Link, All 

鉻(DRAG_ENTER也被炒魷魚的兩倍) ,drag_enter發射兩次):

UntrustedDragDrop 
msSourceUrl 
FileGroupDescriptor 
FileGroupDescriptorW 
FileContents 
UniformResourceLocator 
Effects: Link 

回答

1

您可以使用FileGroupDescriptorW和FileContent格式來獲取您的數據。

  • FileGroupDescriptorW是描述你的數據(例如:名稱,大小,修改時間,...)
  • FileContent包含您的文件內容FileDescriptors'的數組。

如果你不關心的文件名,只需要二進制內容,你可以使用

var filestream = (MemoryStream[])dataObject.GetData("FileContents"); 

如果您想對如何使用FileGroupDescriptor一個更加部門教程(W)我可以在codeproject.com上推薦這個 tutorial。它討論從MS Outlook拖放&,但它使用相同的IDataObject格式。