Electron入门教程4 —— 切换应用的主题

简介: Electron入门教程4 —— 切换应用的主题

如果您想要手动在亮/暗模式之间切换,您可以通过在nativeTheme模块的themeSource属性中设置所需的模式来做到这一点。此属性的值将传播到您的渲染进程。任何与prefers-color-scheme相关的CSS规则都将相应地更新。


先上代码,之后再分析:


index.html


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>主题切换</title>
    <link rel="stylesheet" type="text/css" href="./style.css">
</head>
<body>
<p>当前主题为:<strong id="theme-source">系统主题</strong></p>
<button id="toggle">切换为深色模式</button>
<button id="reset-to-system">切换系统主题</button>
<script src='./index.js'></script>
</body>
</html>


preload.js


const { contextBridge, ipcRenderer } = require('electron')
contextBridge.exposeInMainWorld('darkMode', {
  toggle: () => ipcRenderer.invoke('dark-mode:toggle'),
  system: () => ipcRenderer.invoke('dark-mode:system')
})


index.js


document.getElementById('toggle').addEventListener('click', async () => {
  const isDarkMode = await window.darkMode.toggle()
  document.getElementById('theme-source').innerHTML = isDarkMode ? '深色主题' : '浅色主题'
  document.getElementById('toggle').innerHTML= isDarkMode ? '切换为浅色主题' : '切换为深色主题'
})
document.getElementById('reset-to-system').addEventListener('click', async () => {
  await window.darkMode.system()
  document.getElementById('theme-source').innerHTML = '系统主题'
})


style.css


@media (prefers-color-scheme: dark) {
  body { background: #333; color: white; }
}
@media (prefers-color-scheme: light) {
  body { background: #ddd; color: black; }
}

main.js


const { app, BrowserWindow, ipcMain, nativeTheme } = require('electron')
const path = require('path')
function createWindow () {
    const win = new BrowserWindow({
        width: 800,
        height: 600,
        webPreferences: {
            preload: path.join(__dirname, 'preload.js')
        }
    })
    win.loadFile('index.html')
    ipcMain.handle('dark-mode:toggle', () => {
        if (nativeTheme.shouldUseDarkColors) {
            nativeTheme.themeSource = 'light'
        } else {
            nativeTheme.themeSource = 'dark'
        }
        return nativeTheme.shouldUseDarkColors
    })
    ipcMain.handle('dark-mode:system', () => {
        nativeTheme.themeSource = 'system'
    })
}
app.whenReady().then(() => {
    createWindow()
    app.on('activate', () => {
        if (BrowserWindow.getAllWindows().length === 0) {
            createWindow()
        }
    })
})
app.on('window-all-closed', () => {
    if (process.platform !== 'darwin') {
        app.quit()
    }
})


运行效果如下(这个GIF有点慢,别介意):


ef1b335e3fc3417abf7bb4ce13e3d3cb.gif


CSS文件使用@media媒体查询的prefers-color-scheme来设置< body >元素背景和文本颜色。然后就是用到了上一节教程用到的进程通信的知识。在main.js主进程里面通过nativeTheme.themeSource来设置主题。nativeTheme.shouldUseDarkColors返回一个布尔值,表示操作系统/Chromium当前是否启用了暗模式 , 如果你想修改这个值,你应该使用themeSource。 nativeTheme.themeSource可以有三个属性值:system, light 和dark 。它用于覆盖和取代Chromium选择在内部主题使用的值。


相关文章
|
8月前
|
Web App开发 前端开发 JavaScript
用electron打包前端应用初体验
用electron打包开发桌面应用遇到的各种问题和解决办法
97 1
|
12月前
|
缓存 JavaScript 前端开发
从0到1构建跨平台Electron应用,这篇文章就够了
Electron是一个可以直接开发构建跨平台应用的库,简单、快捷。 《Electron从0到1构建跨平台应用》这篇文章,我摘录了我自己在真实项目中,从开发到生成安装包的要点。
605 0
|
12月前
|
Linux iOS开发 MacOS
使用Electron生成安装包并打包为不同平台的应用格式
导言: 使用Electron开发桌面应用后,我们需要将其打包成适用于不同平台的安装包,例如 Mac 的`dmg`和 Windows 的`exe`。本文将介绍如何使用 Electron-forge 自动生成项目文件,并通过简单的步骤实现打包过程。
4518 0
|
JavaScript Shell
electron使用child_process打开外部应用
electron使用child_process打开外部应用
|
存储 监控 JavaScript
如何治理 Electron 版本淘宝直播应用崩溃?
如何治理 Electron 版本淘宝直播应用崩溃?
11448 0
|
存储 监控 前端开发
如何打造高质量的 Electron 应用?
如何打造高质量的 Electron 应用?
287 0
|
存储 监控 JavaScript
如何治理 Electron 版本淘宝直播应用崩溃?
经过几个月的努力,基于Electron框架开发的新版淘宝直播推流软件终于上线了。随之而来的就是线上用户反馈的各种问题,其中最影响用户体验的当属应用崩溃问题了。当应用程序出现未 catch 的异常时就会发生崩溃,本文介绍了客户端应用崩溃的处理流程。
891 0
如何治理 Electron 版本淘宝直播应用崩溃?
|
JavaScript API
Electron入门教程3 ——进程通信
Electron入门教程3 ——进程通信
341 0
Electron入门教程3 ——进程通信
|
Web App开发 JavaScript 安全
Electron入门教程2 ——进程模型
Electron入门教程2 ——进程模型
191 0
Electron入门教程2 ——进程模型
|
JavaScript 前端开发 Linux
Electron入门教程1 —— 编写第一个桌面应用程序
Electron入门教程1 —— 编写第一个桌面应用程序
791 0
Electron入门教程1 —— 编写第一个桌面应用程序