【发布时间】:2018-08-01 09:13:19
【问题描述】:
我有一个可以拖放 SVG 文件的应用程序。这是适用于 Adobe XD(支持 SVG 文件)等应用程序的工具。执行基本的拖放操作非常简单。
Dim dataObj As New DataObject(DataFormats.FileDrop, New String() {_svgPath})
PictureBox.DoDragDrop(dataObj, DragDropEffects.Copy)
而且它有效!如果我想将文件拖放到资源管理器中,那么一切正常。此外,如果我将一个 .png 文件拖放到编辑器中进行绘制或将字符串拖放到编辑器:它可以工作。
现在的问题是:当涉及到其他第三方应用程序时,它会变得有点混乱。您想将 SVG 文件从您的应用程序拖放到 Adobe XD?不,这行不通!要将 SVG 文件从文件夹拖放到 Adobe XD?这将毫无问题地工作。
这种令人困惑的情况不仅出现在 Adobe XD 中。它们是大量其他程序,在使用资源管理器时可以使用拖放操作,但您“自己创建的”拖放操作失败。
我已经尝试了很多。用不同的数据格式、不同的 DragDropEffects 对其进行了测试……没有任何效果。就像我错过了什么。我已经在 GitHub 上搜索了不同的 DoDragDrop() 函数,在 .NET 文档中搜索只是为了查看是否缺少某些内容。
我在 System.Windows.Forms.Control 关于DoDragDrop() 函数的参考源中找到了这个:
开始拖动操作。 allowedEffects 确定可以发生哪些拖动操作。如果拖动操作需要与另一个进程中的应用程序互操作,则数据应该是基本托管类(字符串、位图或元文件)或实现 System.Runtime.Serialization.ISerializable 的某个对象。 data 也可以是任何实现 System.Windows.Forms.IDataObject 的对象。
但这些信息也没有真正的帮助。
windows 资源管理器如何创建它的 DragDrop 操作以及如何在 .Net 中进行这样的 DragDrop 操作(如果它在 vb.net 或 c# 中无关)?我需要对 DataObject 做更多的事情吗?改造它?改一下?
【问题讨论】:
-
由于您的
DataObject是一个字符串数组,您不需要使用自定义ISerializable对象。尝试提升您的DragDropEffect:pictureBox1.DoDragDrop(dataObj, (DragDropEffects.All | DragDropEffects.Link));。请注意_svgPath必须是完全合格的路径。这适用于 PhotoShop(已测试)。 -
@Jimi 谢谢你的提示,但我已经试过了。有趣的是,如果您使用电子白板,那么您将有相同的行为。如果您通过资源管理器将文件复制到剪贴板,那么就我而言,您可以毫无问题地将其粘贴到 Adobe XD 中。也许 DataObject 是问题所在。我可以尝试将数据作为字节数组添加到 MemoryStream 并将 MemoryStream 传递给 SetData 方法。
-
是的,
DragDropDataObject可以是MemoryStream。但这里不应该需要它。当然,如果该程序从 DragDrop 结果中接受此输入(字符串数组 -> 文件路径)。您是否尝试过使用 PhotoShop 或您正在使用的 WebBrowser?我在两者上都测试了多文件拖放(WB 是 FireFox),并且都接受了拖放并显示位图。自己测试一下。如果它不起作用,则在您的代码中还有其他需要验证的内容。如果它有效,那么 Adobe XD 就有点挑剔了,你必须找出原因(我没有)。 -
我突然想到我发布了一个小项目,用于测试来自 WebBrowser 控件(或其他任何东西)的
Drag&Drop结果。您可以从here 下载它。也许它可以帮助确定当您删除DataObject内容时会发生什么。 -
@Jimi 感谢您提供的信息。是的,它在 Windows 资源管理器和我自己的应用程序之间有很大的不同。我在 Twitter here 上上传了一个屏幕截图 - 好吧,我想我会尝试一下 MemoryStream 可以做什么
标签: .net vb.net winforms drag-and-drop