如何在运行时更改Electron Application菜单中的项目?

时间:2017-03-07 20:26:07

标签: electron

我的电子应用程序有一个应用程序菜单,其中“打开最近”条目作为子菜单。此子菜单中的条目提供了10个最近访问过的文档。我在应用程序启动时填充此菜单,一切正常。但是,为了有资格成为“最近”访问过的文档,我不时会刷新此列表,而不仅仅是在应用程序启动时。我怎样才能做到这一点?

这个

有两个具体的子问题
  1. 我什么时候可以更新?当我正在寻找一些回调 用户点击顶级菜单条目,我可以在其中运行代码 刷新此列表。但我无法让它发挥作用。唯一的 MenuItem的回调是'click',如果它似乎不起作用 它有一个子菜单定义。解决方法是调用 setInterval并定期更新菜单条目,例如1 分钟。但如果有回调我可以做到这一点,我会更喜欢 这一点。
  2. 我该如何更新?我使用Menu.buildFromTemplate()创建一个新菜单,然后将其分配给应用程序菜单层次结构中的submenu条目(我第一次创建它时保存了对应用程序菜单的引用)。但这不起作用。

2 个答案:

答案 0 :(得分:1)

似乎setMenu是您唯一的选择。至于何时做 - 对于" Open Recent"功能,我认为您可以在打开文档时(或关闭文档后)执行此操作:将文档添加到菜单模板并再次调用setMenu

这是从2014年开始,但听起来似乎是定义的行为:

  

Modifying Menu object after setMenu can produce unregistered/dangling accelerators #846

     

在atom-shell中更新菜单栏或应用程序菜单的正确方法是   在你之后调用BrowserWindow.setMenu或app.setApplicationMenu   每次修改Menu对象。

     

这是因为Menu实际上充当模型,本机菜单是   在调用setMenu之前不会创建,所以如果你没有更改模型   更新本机菜单,可能会发生不好的事情。我们使用这种设计   因为它完美地代表了Chromium使用的菜单库   大多数菜单都是静态的。

     

但我认为我们应该找到一种方法来防止崩溃并制造它   在文件中清楚。

  

我关闭了这个,因为我们不支持更改菜单对象   如果用户这样做,则调用setMenu,行为是未定义的。

答案 1 :(得分:0)

Menu.setApplicationMenu是您要寻找的。更改菜单后即可调用它。

const menu = Menu.buildFromTemplate(template);
Menu.setApplicationMenu(menu);