将图像从浏览器拖放到WPF应用程序

我正在尝试在我的WPF应用程序中实现function,将图像从浏览器拖到我的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 } } } 

看看输出,似乎Firefox实际上将图像保存到剪贴板,而Chrome只是抓取图像的html,而IE不会对它做任何事情。

任何人都可以了解我如何获得跨浏览器function?


更新 :我发现的一些解决方法是解析图像源的html(Chrome / Firefox),然后使用类似WebClient对象的源从源代码下载。 但是,更喜欢一种方法,它更强大地检查文件类型。

IE9和Firefox都有一个DeviceIndependentBitmap文件格式,拖动非超链接图像时可用。 这似乎是一个更安全的选择,虽然Chrome似乎不支持它。 它对超链接图像也没那么有用。


使用Firefox,输出是(Drag_Enter由于某种原因被触发两次):

 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 

Chrome(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(再次,drag_enter激发两次):

 UntrustedDragDrop msSourceUrl FileGroupDescriptor FileGroupDescriptorW FileContents UniformResourceLocator Effects: Link 

您可以使用FileGroupDescriptorW和FileContent格式来获取数据。

  • FileGroupDescriptorW是一个描述数据的FileDescriptors数组(例如:名称,大小,修改时间……)
  • FileContent包含您的文件内容。

如果你不关心文件名,只需要你可以使用的二进制内容

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

如果你想要一个关于如何使用FileGroupDescriptor(W)的更多in-dept教程,我可以在codeproject.com上推荐这个教程 。 它讨论了从MS Outlook拖放,但它使用相同的IDataObject格式。