Electron 是否支持将文件路径拖放到另一个应用程序中?
Does Electron support drag-and-dropping a file path into another application?
在 C# WinForms 中,我可以做到这一点
var data = new DataObject(DataFormats.FileDrop, filePaths);
myControl.DoDragDrop(data, DragDropEffects.Copy);
要使另一个应用程序(如记事本)打开filePaths
指定的文件。 WPF 甚至 JavaFX 中的代码都类似。文件路径可以是系统内可访问的任意文件路径,例如C:\Windows\win.ini
或\myFileServer\sharedDir\sharedFile.txt
。我的意思是让记事本打开文件,而不是在其编辑区域中显示文件路径文本。也就是说,我正在寻找文件路径,而不是包含文件路径的字符串。
如果我用 Electron 制作桌面应用程序,我可以做同样的事情吗(仅适用于桌面;不关心 web/mobile)?我已经用据说是用 Electron 创建的 VS Code 对其进行了测试,当我将文件从其“Explorer”拖到记事本中时,没有任何反应。当我在 Notepad++ 中输入时,它只是在其编辑区域显示文件路径字符串,所以我猜 Electron 不支持它,但我想确定一下。
是的,Electron 文档中甚至有关于此的 full example。
示例代码的简短摘要:当拖动特定 DOM 元素时,渲染器会向主进程发送一个事件。要触发 dragstart
事件,DOM 元素需要具有属性 draggable="true"
。在此示例中,我们将要拖动的文件的文件名在消息中传递给主进程。
document.getElementById("foo").ondragstart = event => {
event.preventDefault();
ipcRenderer.send("my-drag-start", "test-file.txt");
}
主进程处理来自渲染器的IPC消息并开始拖动操作。请注意,您需要在拖动操作期间指定一个要附加到光标的图标,如果遗漏会触发错误消息。
ipcMain.on("my-drag-start", (event, filePath) => {
event.sender.startDrag({
file: path.join(__dirname, filePath),
icon: path.join(__dirname, "dnd.png"),
});
});
在 C# WinForms 中,我可以做到这一点
var data = new DataObject(DataFormats.FileDrop, filePaths);
myControl.DoDragDrop(data, DragDropEffects.Copy);
要使另一个应用程序(如记事本)打开filePaths
指定的文件。 WPF 甚至 JavaFX 中的代码都类似。文件路径可以是系统内可访问的任意文件路径,例如C:\Windows\win.ini
或\myFileServer\sharedDir\sharedFile.txt
。我的意思是让记事本打开文件,而不是在其编辑区域中显示文件路径文本。也就是说,我正在寻找文件路径,而不是包含文件路径的字符串。
如果我用 Electron 制作桌面应用程序,我可以做同样的事情吗(仅适用于桌面;不关心 web/mobile)?我已经用据说是用 Electron 创建的 VS Code 对其进行了测试,当我将文件从其“Explorer”拖到记事本中时,没有任何反应。当我在 Notepad++ 中输入时,它只是在其编辑区域显示文件路径字符串,所以我猜 Electron 不支持它,但我想确定一下。
是的,Electron 文档中甚至有关于此的 full example。
示例代码的简短摘要:当拖动特定 DOM 元素时,渲染器会向主进程发送一个事件。要触发 dragstart
事件,DOM 元素需要具有属性 draggable="true"
。在此示例中,我们将要拖动的文件的文件名在消息中传递给主进程。
document.getElementById("foo").ondragstart = event => {
event.preventDefault();
ipcRenderer.send("my-drag-start", "test-file.txt");
}
主进程处理来自渲染器的IPC消息并开始拖动操作。请注意,您需要在拖动操作期间指定一个要附加到光标的图标,如果遗漏会触发错误消息。
ipcMain.on("my-drag-start", (event, filePath) => {
event.sender.startDrag({
file: path.join(__dirname, filePath),
icon: path.join(__dirname, "dnd.png"),
});
});