You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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
    }
}

替代方案:使用状态容器传递参数

如果不想用静态属性传递参数,可以创建一个单例状态容器服务,通过依赖注入传递参数:

  1. 创建状态容器类:
public class NavigationState
{
    public string? TargetPage { get; set; }
}
  1. 在MauiProgram.cs中注册为单例:
builder.Services.AddSingleton<NavigationState>();
  1. 修改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;
        }
    }
}
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 05:05:03