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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 07:11:04