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

Xamarin.Forms页面切换专属事件需求:规避OnDisappearing锁屏触发问题

解决Xamarin.Forms中仅页面切换时响应的"Disappearing"事件问题

嘿,这个困扰我也经历过——OnDisappearing()确实太“灵敏”了,锁屏、切到其他APP甚至弹出系统对话框都会触发它,完全不符合我们只在页面间切换时响应的需求。给你几个靠谱的解决方案:

方法1:监听导航栈变化(原生Xamarin.Forms可用)

页面切换本质是导航栈的变更,我们可以通过订阅导航事件来精准捕捉这种场景:

public YourPage()
{
    InitializeComponent();
    // 订阅导航事件
    Navigation?.Navigated += OnNavigated;
}

private void OnNavigated(object sender, NavigationEventArgs e)
{
    // 判断当前页面是否被导航离开(不在导航栈顶部)
    if (Navigation.NavigationStack.LastOrDefault() != this)
    {
        // 这里就是仅页面切换时的逻辑,替代你原本想在OnDisappearing里写的代码
        HandlePageNavigationAway();
    }
}

// 记得取消订阅,避免内存泄漏
protected override void OnDisappearing()
{
    base.OnDisappearing();
    Navigation?.Navigated -= OnNavigated;
}

private void HandlePageNavigationAway()
{
    // 你的业务逻辑写在这里
    Console.WriteLine("页面已切换到其他页面");
}

这个思路的核心是:只有当当前页面不再是导航栈的顶部页面时,才执行我们的逻辑——锁屏或切APP时,导航栈并不会改变,所以不会触发。

方法2:利用MVVM框架的生命周期事件(推荐)

如果你用Prism、FreshMvvm这类MVVM框架,它们都提供了更精准的页面生命周期钩子,完全避开非页面切换的场景。比如Prism的INavigationAware接口:

public class YourViewModel : INavigationAware
{
    // 仅当页面被导航离开时触发,锁屏/切APP不会调用
    public void OnNavigatedFrom(INavigationParameters parameters)
    {
        // 这里写页面切换离开时的逻辑
        Console.WriteLine("页面已切换到其他页面");
    }

    public void OnNavigatedTo(INavigationParameters parameters)
    {
        // 页面被导航进来时触发
    }

    public void OnNavigatingTo(INavigationParameters parameters)
    {
        // 导航动作发生前触发
    }
}

这种方式更符合MVVM的架构设计,代码也更整洁。

方法3:结合App状态判断(补充方案)

如果不想改太多代码,可以在OnDisappearing()里结合Xamarin.Essentials的App状态来过滤场景:

protected override async void OnDisappearing()
{
    base.OnDisappearing();
    var appState = await AppInfo.RequestAppStateAsync();
    // 只有当APP还在前台时,才认为是页面切换导致的消失
    if (appState == AppState.Foreground)
    {
        HandlePageNavigationAway();
    }
}

这个方法有极小概率的误差(比如某些系统弹窗可能让APP短暂进入后台),但可以作为快速临时解决方案。

内容的提问来源于stack exchange,提问作者Honza Hála

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:00:14