Electron右键菜单在渲染进程更新时为什么没反应?
我在Electron项目里给文本框加右键菜单,按官方文档在渲染进程用context-menu事件监听,通过ipcRenderer.send通知主进程更新菜单,但始终显示默认菜单。主进程收到消息后执行了Menu.buildFromTemplate(template)却没有任何变化,控制台还报错Menu.setApplicationMenu is not a function…
尝试过把菜单创建逻辑移到 preload.js 用 contextBridge 暴露接口,渲染进程直接调用window.api.updateDynamicMenu(),但依然无法动态替换菜单项。查看官方API发现Menu.setApplicationMenu可能已经被弃用,现在应该怎么正确更新当前窗口的上下文菜单?
// 主进程错误代码
const { Menu } = require('electron');
ipcMain.on('update-menu', (event, newItems) => {
const template = [ ...newItems ];
const menu = Menu.buildFromTemplate(template);
Menu.setApplicationMenu(menu); // 这里报错
});
Menu.setApplicationMenu确实不是用来设置右键菜单的,它是用来设置整个应用的顶部菜单栏(macOS的那种),跟右键菜单没啥关系。正确的做法是用
Menu.popup来显示自定义右键菜单。你可以在主进程或渲染进程中创建菜单模板,然后绑定到context-menu事件上。给你个简单示例:
注意几点:
1.
Menu.buildFromTemplate生成的菜单对象要保存起来,不能每次都重新构建。2. 右键菜单要用
popup方法显示,而不是setApplicationMenu。3. 如果你想在preload.js里做,记得通过contextBridge安全地暴露接口。
这样就能动态更新并正确显示右键菜单了。别再折腾
setApplicationMenu了,那玩意真不适用于右键场景。