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

fun*_*iki 8 c# wpf drag-and-drop

我正在尝试在我的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
        }
    }
 }
Run Code Online (Sandbox Code Playgroud)

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

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


更新:我发现的一些解决方法是解析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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Internet Explorer(再次,drag_enter激发两次):

UntrustedDragDrop
msSourceUrl
FileGroupDescriptor
FileGroupDescriptorW
FileContents
UniformResourceLocator
Effects: Link
Run Code Online (Sandbox Code Playgroud)

too*_*ong 1

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

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

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

var filestream = (MemoryStream[])dataObject.GetData("FileContents");
Run Code Online (Sandbox Code Playgroud)

如果您想要有关如何使用 FileGroupDescriptor(W) 的更深入的教程,我可以推荐 codeproject.com 上的本教程。它讨论了 MS Outlook 中的拖放操作,但它使用相同的 IDataObject 格式。