.NET MAUI WinUI点击推送通知重复启动应用问题求助
.NET MAUI 6 WinUI端阻止推送通知重复启动实例的解决方法
问题根源
你遇到的NullReferenceException是因为.NET MAUI WinUI应用的结构和传统UWP不同,Window.Current.Content并非Frame类型,直接强转必然为空。且MAUI的启动逻辑由MauiWinUIApplication封装,不能照搬UWP的OnLaunched写法。
具体解决步骤
- 启用单实例运行
在项目的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); }
替换原Frame强转逻辑
放弃Window.Current.Content as Frame的写法,MAUI中通过Application.Windows[0]获取主窗口,结合MAUI的导航机制处理页面跳转或数据传递,不要直接操作原生WinUI的Content结构。调整推送通知处理逻辑
在推送通知的接收代码中,优先检查应用运行状态:
- 若应用已在后台运行,直接激活主窗口并传递通知数据;
- 若应用未运行,再执行正常启动流程并处理通知参数。
额外注意
- 推送通知的启动逻辑必须放在
Platforms/Windows下的平台专属代码中,不要在MAUI共享项目中处理; - 跨页面传递通知数据推荐使用
WeakReferenceMessenger(.NET MAUI官方推荐),避免强引用导致的内存问题。
内容的提问来源于stack exchange,提问作者Higor Pereira
相关产品推荐
相关产品推荐

