.NET Maui页面导航后原页面代码仍持续运行的问题
.NET Maui 导航后原页面代码持续执行问题解决
问题说明
导航到新页面后,原页面代码未暂停执行(比如await GoToAsync后的Console.WriteLine立刻输出),相机等资源仍在后台运行——这是因为Shell的GoToAsync的await仅等待导航跳转完成,而非等待用户从新页面返回后才继续执行后续代码。
解决方案
1. 利用页面生命周期管理资源
在原页面的OnDisappearing方法中释放相机资源,确保页面离开时停止相机运行:
protected override void OnDisappearing() { base.OnDisappearing(); // 停止相机预览并释放资源 cameraPreview?.StopPreview(); cameraController?.Dispose(); }
当用户返回原页面时,会触发OnAppearing方法,可在此重新初始化相机:
protected override void OnAppearing() { base.OnAppearing(); // 重新初始化相机 InitializeCamera(); }
2. 等待导航返回后再执行代码
如果需要等待用户从新页面返回才执行后续逻辑,可改用Navigation.PushAsync(非Shell导航场景),它的await会等待页面被弹出后才继续执行:
var imageDetailPage = new ImageDetailPage(CurrItem.ImgPath); await Navigation.PushAsync(imageDetailPage); // 这行代码会在用户返回原页面后才执行 Console.WriteLine("####################################### W E R E B A C K");
若坚持使用Shell导航,可通过监听导航事件判断返回时机:
Shell.Current.Navigated += OnNavigatedBack; await Shell.Current.GoToAsync($"Image Detail?Text={CurrItem.ImgPath}"); private void OnNavigatedBack(object sender, ShellNavigatedEventArgs e) { if (e.Source == ShellNavigationSource.Pop) { // 用户回到原页面,执行后续逻辑 Console.WriteLine("回到原页面了"); // 记得取消事件注册,避免内存泄漏 Shell.Current.Navigated -= OnNavigatedBack; } }
3. 核心注意事项
- 相机等硬件资源必须在页面离开时显式释放,避免后台占用;
- Shell导航的
GoToAsync设计为非阻塞跳转,不要依赖它等待用户返回。
内容的提问来源于stack exchange,提问作者Ryan Law
相关产品推荐
相关产品推荐

