当macOS中的外观主题更改时,重新生成ElectronJS窗口

时间:2019-08-19 21:28:54

标签: javascript node.js electron macos-darkmode uivibrancyeffect

大家好。我实际上是在开发一个简单的Electron应用程序,该应用程序具有透明的背景并具有鲜艳的效果。

直到这里一切都还好。问题在于,我需要在new BrowserWindow()函数中将振动效果主题指定为参数,该函数仅在生成窗口时运行。

所以发生的事情是,在生成窗口时,它会检查实际主题,例如,如果外观主题为深色,它将为背景提供dark-vibrancy效果,但是如果我更改外观,则在应用程序运行时会更改外观,因为已经生成了窗口,所以它不会更改外观。

我想我可以让该应用订阅'AppleInterfaceThemeChangedNotification'事件,然后重新加载窗口,但是我不希望我的应用关闭该窗口然后再次打开它,从而导致用户例如,丢失未保存的工作。

Here,您会看到一个 Misive 应用程序的示例,当外观发生变化时,该应用程序会从暗色主题过渡到亮色主题。

因此,简要解释一下,我想知道在用户更改主题时是否有一种方法可以更改振动效果主题(深色或浅色),而无需关闭窗口并再次打开它。

我该如何实现?

任何帮助将不胜感激。

我的代码

创建窗口功能

let mainWindow;

function createWindow() {
  mainWindow = new BrowserWindow({ width: 1000, height: 650, titleBarStyle: 'hidden', vibrancy: systemPreferences.isDarkMode() ? 'dark' : 'light' });
  mainWindow.loadURL(isDev ? 'http://localhost:3000' : `file://${path.join(__dirname, '../build/index.html')}`);

  mainWindow.webContents.on('new-window', function(e, url) {
    e.preventDefault();
    require('electron').shell.openExternal(url);
  });

  mainWindow.on('closed', () => mainWindow = null);

  mainWindow.setMenu(null)
}

app.on('ready', createWindow);

注意1 : 我还注意到,如果出于任何原因重新加载窗口,则会禁用振动效果:

重新加载之前 Before reloading

重新加载后 After reloading

注意2 :另外,似乎macOS Catalina(我正在使用的版本)上存在一个错误,该错误使systemPreferences.isDarkMode()始终返回false,所以我没有无法正确测试。 GitHub Issue

0 个答案:

没有答案