动态更改电子菜单项的状态



在任何标准的本机应用程序中,我的电子的应用都需要根据实时用法结果更改几个菜单项的状态(启用/dsabled)。

我正在main.js中设置菜单:

function createWindow () {
...
...
  require('./menu/mainmenu');
}

Mainmenu中定义了我需要更改的Menuitem:

{ label: "Show Colors",  
        accelerator: 'CmdOrCtrl+1', 
        enabled: getStatus(),
        click() {getWebviewWebContents().send('switchToColors');} 
 },

其中 getStatus()是函数返回 falsetrue

所有这些都在电子中不起作用,因为在应用程序开始时创建了菜单,并且根本无法对其进行修改。我相信这是一个严重的缺乏,因为动态菜单项很常见(即:菜单复选框,启用/禁用等)。

是否有任何解决方法?

我已经通过将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);
});

最新更新