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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 10:17:11