【问题标题】:Electron ApplicationMenu only works for last window when you have multiple windows当您有多个窗口时,Electron ApplicationMenu 仅适用于最后一个窗口
【发布时间】:2020-09-30 19:15:51
【问题描述】:

我想在我的 Electron 应用程序中有多个窗口,每个窗口都应该有自己的 applicationMenu。但是当我打开一个新窗口时,reloadopenDevTools 等应用程序菜单中的功能仅适用于刚刚打开的最后一个窗口。 为什么会这样? 代码示例:

app.on('ready',() => {
  createWindow();
});

ipcMain.on('open-new-window',() => {
  createWindow();
});


function createWindow() {
  const window = new BrowserWindow({
    width:900,
    height:700,
    webPreferences: {
      nodeIntegration: true
    }
  });
  window.loadUrl('index.html');
  const menu = Menu.buildFromTemplate([{
    label: "dev",
    submenu: [{
      label: "Refresh HTML",
      click: () => {
        window.reload();
      }
    }]
  }]);
  Menu.setApplicationMenu(menu);
}

当我从ipcMain 打开一个新窗口时,reload() 函数仅在上次打开的窗口中有效。我是在第一个窗口还是第二个窗口中单击“刷新 HTML”。

【问题讨论】:

    标签: javascript electron


    【解决方案1】:

    您只有一个应用程序菜单,其中(来自docs

    将被设置为每个窗口的顶部菜单

    因此,当您覆盖它时,这是预期的行为。比方说

    1. 您创建窗口#1。 window 变量将引用 #1,因此您的应用程序菜单将重新加载它。
    2. 您创建窗口#2。 window 参考#2,您覆盖应用程序菜单以在单击时重新加载#2
    3. 点击 #1 的菜单无论如何都会重新加载 #2

    要解决此问题,您可以使用BrowserWindow.getFocusedWindow() reload 当前窗口,这样您的MenuItem 的功能将不依赖于window 的引用。

    试试

    click: () => {
      BrowserWindow.getFocusedWindow().reload();
    }
    

    【讨论】:

    • getFocusedWindow() 解决了我的问题。谢谢。
    猜你喜欢
    • 2015-02-07
    • 2021-06-30
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    相关资源
    最近更新 更多