gpt4 book ai didi

node.js - 在 Electron 中堆叠上下文菜单

转载 作者:IT老高 更新时间:2023-10-28 23:21:56 26 4
gpt4 key购买 nike

我正在构建一个基于 Electron 的应用程序,其中包含一个包含唯一行的网格。我想要一个特定于每一行的上下文菜单。这是一个例子:

Image of GUI with context menu

虽然此屏幕截图被裁剪,但您可以看到有多行,每行包含单独的数据。由于我想右键单击一行并获得一个独特的上下文菜单,因此我实现了 electron-context-menu ,在第一次右键单击时确实有效,但随后的右键单击会导致上下文菜单的堆叠效果。

具体来说,会发生以下情况:

  1. 我右键单击第 1 行,然后显示正确的上下文菜单
  2. 我右键单击第 2 行,然后重复显示第 1 行的上下文菜单,然后显示第 2 行的上下文菜单。 (请注意屏幕截图中显示的上下文菜单与我的鼠标所在的行不对应)
  3. 如此反复。

在 React.JS 中,这是我的监听器,它根据 electron-context-menu 模块的需要收集 contextmenu 对象:

  handleContextMenu() {
this.props.contextMenu({
window: electron.remote.BrowserWindow.getFocusedWindow(),
prepend: (params, browserWindow) => [{
label: `Library Compare ${this.state.msn}`,
click: () => this.runLibCompare()
}],
append: (params, browserWindow) => [{
label: '---',
}]
})
};

this.props.contextMenu(...) 将 React.JS 组件注入(inject)其中:

const contextMenu = eRequire('electron-context-menu');

我已经进行了一些大规模的调试,但我认为问题不在于模块。我使用的模块本质上是组织有关上下文菜单的信息,然后使用 electron.remote 函数和来自 Electron 内部的 menu.popup 函数。这是 specific line in github 的链接.

const menu = (electron.Menu || electron.remote.Menu).buildFromTemplate(menuTpl);
menu.popup(electron.remote ? electron.remote.getCurrentWindow() : win);

menu.popup 的调用会导致 line in electron .

  const remoteMemberFunction = function (...args) {
if (this && this.constructor === remoteMemberFunction) {
// Constructor call.
let ret = ipcRenderer.sendSync('ELECTRON_BROWSER_MEMBER_CONSTRUCTOR', metaId, member.name, wrapArgs(args))
return metaToValue(ret)
} else {
// Call member function.
let ret = ipcRenderer.sendSync('ELECTRON_BROWSER_MEMBER_CALL', metaId, member.name, wrapArgs(args))
return metaToValue(ret)
}

}

所以我看到了对 ipcRender.sendSync 的调用——但是当我在 ipcMainreceiver of those calls 中添加调试语句时,我没有看到任何输出!

ipcMain.on('ELECTRON_BROWSER_MEMBER_CALL', function (event, id, method, args) {
try {
args = unwrapArgs(event.sender, args)
let obj = objectsRegistry.get(id)

if (obj == null) {
throwRPCError(`Cannot call function '${method}' on missing remote object ${id}`)
}

callFunction(event, obj[method], obj, args)
} catch (error) {
event.returnValue = exceptionToMeta(error)
}
})

当我向上述函数添加调试语句时,我没有看到任何输出。这就是我搜索他的一面墙的地方。

我正在使用 Electron 1.4.15。我知道这个问题应该是可以解决的,毕竟 Atom IDE(它是基于 Electron 的)没有这个问题,即使它有多个上下文菜单。

我认为我需要在某处清除一些内存,我只是不知道如何清除以前的上下文菜单堆栈!

最佳答案

我首先使用 e.target 获取点击的目标来解决这个问题。然后,根据这一点,我调用相应的上下文菜单。如果目标命中不在我的应用的目标列表中,我会使用默认的上下文菜单。

window.addEventListener(
"contextmenu",
e => {
e.preventDefault();
if (e.target.id === 'fullscr'){

console.log(e && e.target);

// e.preventDefault();
mymenu.popup(remote.getCurrentWindow());
}else{
editmenu.popup(remote.getCurrentWindow());
}
console.log(e.which);
},
false
);

关于node.js - 在 Electron 中堆叠上下文菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42148183/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com