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