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

.NET MAUI WinUI点击推送通知重复启动应用问题求助

.NET MAUI 6 WinUI端阻止推送通知重复启动实例的解决方法

问题根源

你遇到的NullReferenceException是因为.NET MAUI WinUI应用的结构和传统UWP不同,Window.Current.Content并非Frame类型,直接强转必然为空。且MAUI的启动逻辑由MauiWinUIApplication封装,不能照搬UWP的OnLaunched写法。

具体解决步骤

  1. 启用单实例运行
    在项目的Platforms/Windows/App.xaml.cs中重写OnLaunched方法,先检查是否已有应用实例,若存在则激活现有窗口而非启动新实例:
protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args)
{
    // 检测已有实例
    var existingApp = Microsoft.UI.Xaml.Application.Current as App;
    if (existingApp != null && existingApp.Windows.Count > 0)
    {
        // 激活第一个主窗口
        var mainWindow = existingApp.Windows[0];
        mainWindow.Activate();
        
        // 处理推送通知参数(如需传递通知内容到已运行实例)
        if (!string.IsNullOrEmpty(args.Arguments))
        {
            // 可通过WeakReferenceMessenger或MessagingCenter传递参数
            // 示例:WeakReferenceMessenger.Default.Send(new NotificationMessage(args.Arguments));
        }
        return;
    }

    // 正常启动MAUI应用
    base.OnLaunched(args);
}
  1. 替换原Frame强转逻辑
    放弃Window.Current.Content as Frame的写法,MAUI中通过Application.Windows[0]获取主窗口,结合MAUI的导航机制处理页面跳转或数据传递,不要直接操作原生WinUI的Content结构。

  2. 调整推送通知处理逻辑
    在推送通知的接收代码中,优先检查应用运行状态:

  • 若应用已在后台运行,直接激活主窗口并传递通知数据;
  • 若应用未运行,再执行正常启动流程并处理通知参数。

额外注意

  • 推送通知的启动逻辑必须放在Platforms/Windows下的平台专属代码中,不要在MAUI共享项目中处理;
  • 跨页面传递通知数据推荐使用WeakReferenceMessenger(.NET MAUI官方推荐),避免强引用导致的内存问题。

内容的提问来源于stack exchange,提问作者Higor Pereira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:35:11