如何在运行时更改Electron应用程序菜单中的项目?

如何在运行时更改Electron应用程序菜单中的项目?,electron,Electron,我的电子应用程序有一个应用程序菜单,其中“打开最近的”条目作为子菜单。此子菜单中的条目提供10个最近访问的文档。我在应用程序启动并且一切正常时填充此菜单。然而,为了有资格成为“最近”访问的文档,我必须不时刷新此列表,而不仅仅是在应用程序启动时。我怎样才能做到这一点 这有两个具体的子问题 我什么时候可以更新这个?我正在寻找一些回拨电话,电话铃响了 用户单击顶层菜单项,我可以在其中运行代码 以刷新此列表。但我没法让它发挥作用。唯一的 菜单项的回调是“单击”,如果 它定义了一个子菜单。一种解决方法是调

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

这有两个具体的子问题

  • 我什么时候可以更新这个?我正在寻找一些回拨电话,电话铃响了 用户单击顶层菜单项,我可以在其中运行代码 以刷新此列表。但我没法让它发挥作用。唯一的 菜单项的回调是“单击”,如果 它定义了一个子菜单。一种解决方法是调用 设置间隔并定期更新菜单项,例如1 但是如果有一个回调,我可以这样做,我会更喜欢 那个
  • 我如何更新这个?我使用
    Menu.buildFromTemplate()
    创建一个新菜单,然后将其分配给应用程序菜单层次结构中的
    子菜单
    项(我在第一次创建应用程序菜单时保存了对该菜单的引用)。但这不起作用

  • 似乎
    setMenu
    是您唯一的选择。至于何时执行此操作–对于“打开最近”功能,我认为您可以在打开文档时(或在文档关闭后)执行此操作:将文档添加到菜单模板中,然后再次调用
    setMenu


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

    在AtomShell中更新菜单栏或应用程序菜单的正确方法是 在完成后调用BrowserWindow.setMenu或app.setApplicationMenu 每次都修改菜单对象

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

    但我认为我们应该找到一种方法来防止撞车,并使之成功 在文件中明确

    以及:

    我关闭此操作是因为我们不支持在之后更改菜单对象 调用setMenu时,如果用户这样做,则行为是未定义的


    Menu.setApplicationMenu是您要查找的内容。您可以在更改菜单后调用它

    const menu = Menu.buildFromTemplate(template);
    Menu.setApplicationMenu(menu);
    
    你能举一个“更改菜单”的例子吗?在您给出的示例中,您是从模板构造新菜单,而不是更改现有菜单。从
    菜单返回的菜单。getApplicationMenu()
    似乎没有传递给setApplicationMenu的数据结构。。。