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

本文关键字:WPF 应用程序 拖放 浏览器 图像 | 更新日期: 2023-09-27 18:37:25

我正在尝试在我的 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
        }
    }
 }

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

有人对我如何获得跨浏览器功能有一些见解吗?


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

IE9 和 Firefox 都具有与设备无关的位图文件格式,在拖动非超链接图像时可用。这似乎是一个更安全的选择,尽管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

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

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

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

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

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

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