在任何标准的本机应用程序中,我的电子的应用都需要根据实时用法结果更改几个菜单项的状态(启用/dsabled)。
我正在main.js中设置菜单:
function createWindow () {
...
...
require('./menu/mainmenu');
}
Mainmenu中定义了我需要更改的Menuitem:
{ label: "Show Colors",
accelerator: 'CmdOrCtrl+1',
enabled: getStatus(),
click() {getWebviewWebContents().send('switchToColors');}
},
其中 getStatus()
是函数返回 false
或 true
。
所有这些都在电子中不起作用,因为在应用程序开始时创建了菜单,并且根本无法对其进行修改。我相信这是一个严重的缺乏,因为动态菜单项很常见(即:菜单复选框,启用/禁用等)。
是否有任何解决方法?
我已经通过将ID设置为菜单项修复了此问题,
{ label: "Show Colors",
id: 'color-scale',
accelerator: 'CmdOrCtrl+1',
enabled: getStatus(),
click() {getWebviewWebContents().send('switchToColors');}
},
并使用以下方式获取菜单项
myItem = menu.getMenuItemById('color-scale')
然后,当我需要以编程方式启用/禁用IT时,我正在使用:
myItem.enabled = true
或
myItem.enabled = false
到目前为止,我知道和使用的唯一解决方法是每次更改Menuitem时重建整个菜单。这不是很符合人体工程学的友好型,而是足够足够的工作,并且不会引起很多开销。
这是我的解决方案:
main.js(main Process)
const menuTemplate = [{
label: 'Options',
submenu: [
{
label: 'Config',
enabled: false,
click() { //do stuff }
}
]
}];
// Enable menu items when user login. Fetching value from renderer process
ipcMain.on('logged-in', (event, args) => {
if (args !== true) {
return;
}
// Modify menu item status
menuTemplate[0].submenu[0].enabled = true;
// Rebuild menu
const menu = Menu.buildFromTemplate(menuTemplate);
Menu.setApplicationMenu(menu);
});