电子-听'menu-will-show'事件

时间:2019-03-05 18:48:01

标签: events menu electron

环境:

  • 操作系统:Ubuntu Cosmic(18.10)
  • Electronjs:4.0.5

Electron文档指示菜单实例上有两个事件:

  • “菜单将显示”
  • “菜单关闭”

但是,文档未指出如何在菜单实例上为事件注册侦听器。

在我的主应用程序菜单上(通过Menu.buildFromTemplate实例化,以及 设置为Menu.setApplicationMenu),我已经尝试了从buildFromTemplate返回的菜单实例的以下变化:

  • menu.addListener('menu-will-show',()=> {})
  • menu.addEventListener('menu-will-show',()=> {})
  • menu.on('menu-will-show',()=> {})
  • (以上每种方法均指定类而不是实例)
  • (以上每种方法都指定了Menu.getAppliationMenu返回的对象(以防我发送的菜单对象在 set 上被破坏,或者被丢弃)

它们都没有触发。

文档说某些事件在指定的某些操作系统上不起作用,但是事件文档中没有其他信息表明linux不起作用。

目的是在显示菜单之前检查并设置菜单项状态。

我可以用其他方式蛮力设置项目状态,但如果可能的话,宁愿使用这种机制。

最终,我将在Windows和OSX上进行尝试,但在Linux上却没有发生。

1 个答案:

答案 0 :(得分:0)

以编程方式调用menu.popup()时将触发此事件:

  

在调用menu.popup()时发出。

来源:https://electronjs.org/docs/api/menu#event-menu-will-show

这是一个例子:

这是我的主线。它创建一个菜单并每秒钟调用menu.popup。所以我应该在控制台中看到。

const {app, BrowserWindow, Menu} = require('electron');
const url = require('url');
const path = require('path');

app.on('ready', () => {
  const menu = Menu.buildFromTemplate([
    {
      role: 'help',
      submenu: [
        {label: 'Order a burrito'}
      ]
    }
  ]);
  Menu.setApplicationMenu(menu);
  menu.addListener('menu-will-show', () => {
    console.log('');
  });

  const mainWindow = new BrowserWindow({width: 800, height: 600});
  mainWindow.loadURL(
    url.format({
      pathname: path.join(__dirname, 'index.html'),
      protocol: 'file:',
      slashes: true
    })
  );

  setInterval(()=> {
    menu.popup({window: mainWindow});
  }, 1000);

});

正如您在此截屏视频中所看到的,menu.popup()调用使上下文菜单出现,该菜单又将墨西哥卷饼打印到控制台:

enter image description here