如何在电子中取消注册上下文菜单listerners

时间:2017-02-22 19:52:01

标签: node.js event-handling mouseevent contextmenu electron

我之前写过这个问题Stacking of Context Menus in Electron并在context menu module for electron中创建了这个问题。

尽管上面的问题非常详细,但没有得到回复。然后,@sindresorhus建议我在StackOverflow上问这个问题:

如何在电子中取消注册上下文菜单?我有一个程序,根据您点击的位置,将显示一个不同的上下文菜单:

  handleContextMenu() {
    this.props.contextMenu({
      prepend: (params, browserWindow) => [{
        label: `Summary ${this.state.msn}`,
        click: () => this.createSummary()
      },{
        label: `Library Compare ${this.state.msn}`,
        click: () => this.runLibCompare()
      },{
        label: `Visualize ${this.state.msn}`,
        click: () => dialog.showMessageBox({
            type: 'question',
            buttons: this.vizButtons,
            defaultId: 0,
            title: `Choose your visualization`,
            message: `Choose your visualization for ${this.state.msn}.`,
          }, res => this.visualize(res))
      }]
    });
  };

然而,当我右键单击另一个区域时,会弹出第一个上下文菜单,然后是第二个上下文菜单,直到当前上下文菜单出现。

我基本上想在取消后取消注册上下文菜单。我该怎么做?

更新: 摆脱了上下文菜单,只需将其输入handleContextMenu函数:

  handleContextMenu = menuItems => {
    const menu = new electron.remote.Menu();
    menu.append(new electron.remote.MenuItem(menuItems));
    menu.popup(electron.remote.getCurrentWindow());
  }

它有效!就是这样,摆脱了电子上下文菜单。

1 个答案:

答案 0 :(得分:1)

对于没有附加模块的标准Electron Menu API,这是可能的,或许使用electron-context-menu只会使事情变得复杂,因为这似乎是为了简化标准上下文菜单的特定用例的事情。使用标准Menu API,您可以在每次单击时创建并弹出菜单,因此无需“取消注册”菜单。

这是一个简化的示例,每次点击都会创建一个不同的新上下文菜单:

let menuCount = 1;
window.addEventListener('contextmenu', (e) => {
  e.preventDefault();
  let menu = new electron.remote.Menu();
  menu.append(new electron.remote.MenuItem({label : "Context Menu "+menuCount++}))
  menu.popup(electron.remote.getCurrentWindow());
});

在第一次右键单击时,您将看到一个菜单,其中包含“上下文菜单1”项,第二次右键单击“上下文菜单2”,依此类推。