.NET MAUI Blazor Windows端:处理通知点击跳转指定页面
.NET MAUI Blazor Windows通知点击跳转指定页面解决方案
问题根源:无法重写OnActivated的原因
.NET MAUI Windows项目的App.xaml.cs继承的是MauiWinUIApplication,而非UWP原生的Application类,因此直接重写OnActivated会报错。需要通过订阅激活事件的方式处理通知触发的应用激活。
实现步骤
1. 更新通知服务,传递页面参数
修改你的NotificationService,在Toast按钮的参数中添加目标Blazor页面的路径,确保跳转参数能被后续激活逻辑捕获:
#if WINDOWS using MAUIDemo.Services; using Microsoft.Toolkit.Uwp.Notifications; using System; namespace MAUIDemo.PlatformServices.Windows { public class NotificationService : INotificationService { public void ShowNotification(string title, string body, string targetPage = "/Details") { new ToastContentBuilder() .AddToastActivationInfo(null, ToastActivationType.Foreground) .AddAppLogoOverride(new Uri("ms-appx:///Assets/dotnet_bot.png")) .AddText(title, hintStyle: AdaptiveTextStyle.Header) .AddText(body, hintStyle: AdaptiveTextStyle.Body) .AddButton(new ToastButton() .SetContent("查看详情") .AddArgument("action", "viewDetails") .AddArgument("page", targetPage)) // 添加目标页面参数 .AddButton(new ToastButton() .SetContent("稍后提醒") .AddArgument("action", "remindLater")) .Show(); } } } #endif
2. 在Windows平台处理激活事件
在Platforms/Windows/App.xaml.cs中订阅应用的Activated事件,解析Toast通知的参数并存储目标页面路径:
using Microsoft.Maui; using Microsoft.Maui.Hosting; using Windows.ApplicationModel.Activation; using Microsoft.Toolkit.Uwp.Notifications; namespace MAUIDemo.WinUI { public partial class App : MauiWinUIApplication { // 静态属性存储目标页面,供Blazor端读取 public static string? NotificationTargetPage { get; set; } public App() { InitializeComponent(); // 订阅激活事件 this.Activated += OnAppActivated; } protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); private void OnAppActivated(object sender, IActivatedEventArgs e) { // 只处理Toast通知触发的激活 if (e is ToastNotificationActivatedEventArgs toastArgs) { var args = ToastArguments.Parse(toastArgs.Argument); // 提取目标页面参数 if (args.TryGetValue("page", out string? page)) { NotificationTargetPage = page; } // 可选:处理其他action参数,比如"remindLater"逻辑 if (args.TryGetValue("action", out string? action)) { if (action == "remindLater") { // 这里添加稍后提醒的逻辑,比如设置本地定时通知 } } } } } }
3. Blazor端触发页面跳转
在Blazor的布局组件(比如MainLayout.razor)中,读取存储的目标页面参数并执行跳转:
@inject NavigationManager NavManager @* 你的布局内容 *@ @code { protected override void OnInitialized() { base.OnInitialized(); #if WINDOWS var targetPage = MAUIDemo.WinUI.App.NotificationTargetPage; if (!string.IsNullOrEmpty(targetPage)) { NavManager.NavigateTo(targetPage); // 重置参数,避免应用再次启动时重复跳转 MAUIDemo.WinUI.App.NotificationTargetPage = null; } #endif } }
替代方案:使用状态容器传递参数
如果不想用静态属性传递参数,可以创建一个单例状态容器服务,通过依赖注入传递参数:
- 创建状态容器类:
public class NavigationState { public string? TargetPage { get; set; } }
- 在
MauiProgram.cs中注册为单例:
builder.Services.AddSingleton<NavigationState>();
- 修改Windows平台激活逻辑,注入状态容器并设置参数:
// 在Platforms/Windows/App.xaml.cs中,通过Services获取状态容器 private void OnAppActivated(object sender, IActivatedEventArgs e) { if (e is ToastNotificationActivatedEventArgs toastArgs) { var args = ToastArguments.Parse(toastArgs.Argument); if (args.TryGetValue("page", out string? page)) { var navState = Services.GetService<NavigationState>(); navState?.TargetPage = page; } } }
- Blazor组件中注入状态容器并监听变化:
@inject NavigationManager NavManager @inject NavigationState NavState @code { protected override void OnInitialized() { base.OnInitialized(); if (!string.IsNullOrEmpty(NavState.TargetPage)) { NavManager.NavigateTo(NavState.TargetPage); NavState.TargetPage = null; } } }
内容的提问来源于stack exchange,提问作者Suman Mondal
相关产品推荐
相关产品推荐

