Xamarin.Forms中如何检测页面已打开,避免重复推入栈?
解决Xamarin.Forms重复推入MyPage的问题
你的代码无法检测到页面存在的核心问题是空值判断逻辑有误:当NavigationStack或ModalStack为null时,NavigationStack?.Any(...)返回的是null,而null == true的结果是false,这会导致即使页面存在于某个栈中,判断条件也可能不成立。
修正后的代码
替换原判断逻辑,使用?? false将空值转为false,确保判断逻辑正确:
// 检查导航栈和模态栈中是否存在MyPage var existsInStack = App.Current.MainNavigation.NavigationStack?.Any(x => x is MyPage) ?? false; var existsInModalStack = App.Current.MainNavigation.ModalStack?.Any(x => x is MyPage) ?? false; if (existsInStack || existsInModalStack) { return; } await App.Current.MainNavigation.PushModalAsync(new MyPage());
额外注意事项
如果你的应用使用了MasterDetailPage或TabbedPage作为根页面,App.Current.MainNavigation可能指向的是根页面的导航栈,而非当前活跃页面的导航栈。这种情况下需要先获取当前活跃的导航实例:
Page currentPage = App.Current.MainPage; INavigation currentNavigation = currentPage.Navigation; // 遍历找到实际的导航栈(比如嵌套的NavigationPage) while (currentPage is NavigationPage navPage) { currentNavigation = navPage.Navigation; currentPage = navPage.CurrentPage; } // 用获取到的currentNavigation进行判断 var existsInStack = currentNavigation.NavigationStack?.Any(x => x is MyPage) ?? false; var existsInModalStack = currentNavigation.ModalStack?.Any(x => x is MyPage) ?? false; if (existsInStack || existsInModalStack) { return; } await currentNavigation.PushModalAsync(new MyPage());
内容的提问来源于stack exchange,提问作者Drake
相关产品推荐
相关产品推荐

