如何在.NET MAUI Blazor Hybrid中实现系统托盘图标及交互?
.NET MAUI Blazor 实现系统托盘图标方案
核心思路
.NET MAUI本身无原生系统托盘支持,需通过平台特定代码结合第三方工具包或自定义实现,Blazor项目需注意与MAUI原生逻辑的交互。
可行方案
方案一:使用 CommunityToolkit.Maui
官方维护的工具包已支持跨平台系统托盘(TrayIcon),兼容Blazor项目:
- 安装NuGet包:
CommunityToolkit.Maui和CommunityToolkit.Maui.Core - 在
MauiProgram.cs中注册工具包:builder.UseMauiApp<App>().UseMauiCommunityToolkit(); - 在MAUI原生逻辑层(如
MainPage.xaml.cs)创建托盘图标:var trayIcon = new TrayIcon { Icon = ImageSource.FromFile("tray_icon.png"), TooltipText = "MAUI Blazor 托盘示例" }; // 添加右键菜单 trayIcon.MenuItems.Add(new MenuItem { Text = "打开窗口", Command = new Command(() => App.Current.MainPage.Show()) }); trayIcon.MenuItems.Add(new MenuItem { Text = "退出", Command = new Command(() => Application.Current.Quit()) }); // 托盘图标点击事件 trayIcon.Tapped += (s, e) => App.Current.MainPage.Show(); // 显示托盘图标 TrayIcon.Add(trayIcon); - Blazor组件可通过依赖注入调用MAUI封装的托盘服务,实现跨层交互。
方案二:自定义平台特定实现
若第三方库不兼容,可针对目标平台编写原生代码:
- Windows平台:在
Platforms/Windows/App.xaml.cs中利用Windows Forms NotifyIcon:protected override void OnLaunched(LaunchActivatedEventArgs args) { base.OnLaunched(args); var notifyIcon = new System.Windows.Forms.NotifyIcon { Icon = new System.Drawing.Icon("tray_icon.ico"), Visible = true, Text = "MAUI Blazor 托盘" }; // 添加菜单和点击事件逻辑 } - macOS平台:在
Platforms/MacOS/AppDelegate.cs中利用AppKit NSStatusItem:public override void DidFinishLaunching(NSNotification notification) { base.DidFinishLaunching(notification); var statusItem = NSStatusBar.SystemStatusBar.CreateStatusItem(NSStatusItemLength.Variable); statusItem.Image = NSImage.ImageNamed("tray_icon.png"); statusItem.ToolTip = "MAUI Blazor 托盘"; // 添加右键菜单逻辑 }
修复hardcodet库兼容问题
你之前尝试的hardcodet NotifyIcon库适配WPF/WinForms,在MAUI中需调整:
- 确保引用.NET 6+兼容版本
- 在Windows平台项目的
Platforms/Windows/Windows.csproj中添加Windows Forms引用:<ItemGroup> <FrameworkReference Include="Microsoft.WindowsDesktop.App.WindowsForms" /> </ItemGroup> - 仅在Windows平台代码中实例化NotifyIcon,封装为MAUI服务后供Blazor调用,不要直接在Blazor组件中操作。
注意事项
- 图标资源需适配对应平台格式(Windows用.ico,macOS用.png),放入平台资源目录
- Blazor组件通过依赖注入调用托盘服务,避免直接操作平台API
- 测试时注意平台权限(如macOS需允许通知权限)
内容的提问来源于stack exchange,提问作者Francisco Jose GOÑI
相关产品推荐
相关产品推荐

