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
相关产品推荐
相关产品推荐

