【问题标题】:How to change items in Electron Application menu at runtime?如何在运行时更改电子应用程序菜单中的项目?
【发布时间】:2017-03-07 20:26:06
【问题描述】:

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

对此有两个具体的子问题

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

【问题讨论】:

    标签: electron


    【解决方案1】:

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


    这是 2014 年的,但听起来像是已定义的行为:

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

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

    这是因为 Menu 实际上是一个模型,而原生菜单是 直到你调用 setMenu 才创建,所以如果你改变模型而不 更新本机菜单,可能会发生不好的事情。我们使用这种设计 因为它完美地代表了 Chromium 使用的菜单库,并且 大多数菜单都是静态的。

    但我认为我们应该找到一种方法来防止崩溃并成功 在文件中明确。

    还有:

    我将关闭它,因为我们不支持在之后更改菜单对象 调用 setMenu,如果用户这样做,则行为未定义。

    【讨论】:

      【解决方案2】:

      Menu.setApplicationMenu 是您正在寻找的。您可以在更改菜单后调用它。

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

      【讨论】:

      • 你能举一个“改变你的菜单”的例子吗?在您给出的示例中,您正在从模板构建一个新菜单,而不是更改现有菜单。从Menu.getApplicationMenu() 返回的菜单似乎没有传递给 setApplicationMenu 的数据结构...
      猜你喜欢
      • 2016-01-06
      • 1970-01-01
      • 1970-01-01
      • 2012-10-22
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      相关资源
      最近更新 更多