Avalonia 11.3中如何根据系统主题切换托盘图标
Avalonia 11.3 系统主题切换时动态修改托盘图标
完整实现方案
1. 调整App.axaml中的托盘图标声明
无需额外添加x:Name,保持简洁结构即可(注意替换为你实际的资源路径):
<Application xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="AppName.App"> <Application.Styles> <FluentTheme Mode="Auto" /> </Application.Styles> <TrayIcon.Icons> <TrayIcons> <TrayIcon Icon="avares://AppName/Assets/icon_light.png" ToolTipText="Foo Bar"> <TrayIcon.Menu> <!-- 按需添加菜单内容 --> </TrayIcon.Menu> </TrayIcon> </TrayIcons> </TrayIcon.Icons> </Application>
2. 在App.axaml.cs中实现逻辑
通过Application内置的TrayIcon.Icons集合获取实例,绑定主题切换事件完成图标替换:
using Avalonia; using Avalonia.Controls; using Avalonia.Styling; using System.Linq; namespace AppName; public partial class App : Application { private TrayIcon? _trayIcon; public override void Initialize() { InitializeComponent(); // 注册主题变更事件 ActualThemeVariantChanged += OnThemeChanged; } public override void OnFrameworkInitializationCompleted() { base.OnFrameworkInitializationCompleted(); // 从托盘图标集合中获取目标实例 _trayIcon = TrayIcon.Icons?.OfType<TrayIcon>().FirstOrDefault(); } private void OnThemeChanged(object? sender, ActualThemeVariantChangedEventArgs e) { if (_trayIcon == null) return; // 根据当前主题切换对应图标 _trayIcon.Icon = e.NewThemeVariant == ThemeVariant.Dark ? new WindowIcon("avares://AppName/Assets/icon_dark.png") : new WindowIcon("avares://AppName/Assets/icon_light.png"); } }
关键细节说明
- 实例获取逻辑:
TrayIcon.Icons是TrayIcons类型的专属集合,直接通过OfType<TrayIcon>()筛选后取第一个元素即可拿到目标实例,无需依赖视觉树查找。 - 主题判断:
ActualThemeVariantChangedEventArgs.NewThemeVariant会返回当前系统的主题枚举值(ThemeVariant.Dark/ThemeVariant.Light),据此精准切换图标。 - 资源配置:确保图标文件的属性设置为
AvaloniaResource,否则avares://路径无法正确访问资源。
内容的提问来源于stack exchange,提问作者lak-b
相关产品推荐
相关产品推荐

