1. 前言

跟随系统主题已经是绝大多数App和网站的标配

但是如何在Blazor中跟随系统主题?

只找到Masa Blazor技术团队发的 MAUI + Masa Blazor 开发界面跟随系统主题切换的App

此方法由于使用 MAUI提供的Application.Current.RequestedTheme来获取系统主题,Application.Current.RequestedThemeChanged来监听系统主题变化,存在一定的局限性

而让Blazor WebAssembly、Blazor Server以及Winform、WPF、Photino.Blazor等支持跟随系统主题,就必须要从Web中入手

搜了一圈,基本上都是用js,window.matchMedia('(prefers-color-scheme:dark)').matches;和window.matchMedia('(prefers-color-scheme:dark)').addEventListener

但实际上这种方法获得的是浏览器主题,只不过浏览器主题默认是跟随系统的,所有才会有如此效果。

只能凑合着用了。

2. 添加js

function followSystemTheme(dotNet, callbackMethod) {
window.matchMedia('(prefers-color-scheme:dark)').addEventListener('change', (e) => {
dotNet.invokeMethodAsync(callbackMethod, e.matches);
});
}
function systemIsDarkTheme() {
return window.matchMedia('(prefers-color-scheme:dark)').matches;
}

3. 调用

[Inject]
private IJSRuntime JS {get;set;} = default!; bool dark = await JS.InvokeAsync<bool>("systemIsDarkTheme", new object[] { }); var dotNetCallbackRef = DotNetObjectReference.Create(this);
await JS.InvokeVoidAsync("followSystemTheme", new object[2] { dotNetCallbackRef, "NotifyChanged" }); [JSInvokable]
public void NotifyChanged(bool value)
{ }

4. 进阶

如果你想要更便捷的方式,可以使用我已经封装好的包 Yu-Core.BlazorToolkit

大概下面这样,具体用法看README

AppTheme SystemTheme = await Theme.Default.GetSystemThemeAsync();
Theme.Default.SystemThemeChanged += ThemeChanged;

Blazor如何跟随“系统主题”?的更多相关文章

  1. 【Windows 10 应用开发】跟随系统主题颜色

    有些时候,希望应用程序中的某些颜色可以与系统的主题颜色相同,并且当系统主题色改变时进行同步. 实现过程并不复杂,主要用到 UISettings 类,它公开一个 GetColorValue 方法,访问这 ...

  2. [daily]gtk程序不跟随系统的dark主题

    问题描述: 我的系统主题是dark的.在使用mysql-workbench是,里边的一些线条就跟随了系统文字的主要使用了灰白色. 这样在白色画布里就看不见这些线条了. 方法: 设置mysql-work ...

  3. 网页跟随系统 dark mode (暗黑模式) 的实现

    经过几十年的沉默, dark mode(暗黑模式) 又回到了我们面前,越来越多的 APP 有了暗黑主题,越来月多的操作系统原生添加了 "全局暗黑模式", 那么一个网站如何跟随系统的 ...

  4. vite实现element-plus按需配置,自定义主题和读取/修改系统主题色

    项目地址 vite.config.ts 插件和vite配置 import { defineConfig } from "vite"; import vue from "@ ...

  5. [置顶] iOS 应用程序内部国际化,不跟随系统语言

    前言:网络上关于iOS国际化的文章很多,但基本上都是基于跟随系统语言的国际化,笔者就不赘述了-0 – 今天要讲的是不跟随系统的切换语言版本方案,即程序内部的切换语言版本方案. 一.总则: 应用内部语言 ...

  6. emqtt 试用(六)系统主题

    $SYS-系统主题 EMQ 消息服务器周期性发布自身运行状态.MQTT 协议统计.客户端上下线状态到 $SYS/ 开头系统主题. $SYS 主题路径以 "$SYS/brokers/{node ...

  7. Android: 设置 app 字体大小不跟随系统字体调整而变化

    在做 app 内字体大小的需求,类似于 微信中设置字体大小. 那么就需要 app 不跟随系统字体大小调整而变化,找到了两个方法. 方法1: 重写 getResource() 方法,修改 configu ...

  8. iOS 应用程序内部国际化,不跟随系统语言

    前言:网络上关于iOS国际化的文章很多,但基本上都是基于跟随系统语言的国际化,笔者就不赘述了-0 – 今天要讲的是不跟随系统的切换语言版本方案,即程序内部的切换语言版本方案. 一.总则: 应用内部语言 ...

  9. emqtt 系统主题

    $SYS-系统主题 EMQ 消息服务器周期性发布自身运行状态.MQTT 协议统计.客户端上下线状态到 $SYS/ 开头系统主题. $SYS 主题路径以 “$SYS/brokers/{node}/” 开 ...

  10. UWP实现第二字幕并且跟随系统的设置

    话不多说,先看一下最终效果 系统设置默认 在系统设置里面更改字幕的显示效果 需求 要求播放器可以显示第二字幕,类似旁白的文字解释.比如片中出现了一个专业术语,这个时候观众可能有些疑惑.所以需要在屏幕上 ...

随机推荐

  1. 【LeetCode动态规划#10】完全背包问题实战,其三(单词拆分,涉及集合处理字符串)

    单词拆分 力扣题目链接(opens new window) 给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词. 说明: 拆 ...

  2. ROS动态调试PID参数

    ROS动态调试PID参数 连接小车 注意:必须在同一区域网 ssh clbrobort@clbrobort 激活树莓派主板 roslaunch clbrobot bringup.launch 打开PI ...

  3. JSP 的本质原理解析:"编写的时候是JSP,心里想解读的是 java 源码"

    JSP 的本质原理解析:"编写的时候是JSP,心里想解读的是 java 源码" @ 目录 JSP 的本质原理解析:"编写的时候是JSP,心里想解读的是 java 源码&q ...

  4. vue页面中展示markdown以及katex公式

    场景 数据库中有markdown语法的字符串,需要展示为正常的页面,难点在于其中的katex数学公式 解决方式 使用showdown及其族系插件 npm i showdown npm i showdo ...

  5. Vue拖拽排序

    转载至https://www.crazyming.com/note/757/ 使用拖拽功能来实现排序. 需要先学习w3cschool 关于拖拽的教程:http://www.w3school.com.c ...

  6. 2020-12-23:如何保证MQ的高可用?

    福哥答案2020-12-23: ActiveMQ:Master-Slave 部署方式主从热备,方式包括通过共享存储目录来实现(shared filesystem Master-Slave).通过共享数 ...

  7. 这款全自动自适应工具你用过了吗?autofit.js请求加入你的战场!

    前段时间做了一个自适应的小工具(autofit.js) 经过一段时间的试用,同学们发现了工具存在的一些问题,我自己也发现了一些,这篇文章是针对这些问题撰写的. autofit.js autofit.j ...

  8. 【Java】连接MySQL问题总结

    前言 最近在学习Java的数据库相关操作,在看视频时自己找资源而产生的一些问题,在此做个总结. 正文 在刚开始学习的时候,你可能跟着老师这样写代码,虽然某些地方已经冒出了红色的波浪线,但你半信半疑的继 ...

  9. Android failed linking file resources.

    今天在配置一个app 的启动资源文件时老是提示error: failed linking file resources. 且转悠半天这个提示太难定位错误的范围了,最后发现旁边的一个图标,鼠标移入tit ...

  10. vscode 注释快捷键 一键注释和取消注释快捷键

    // 注释:ctrl+/ /**/ 注释:alt+shift+a