如何清除导航堆栈?

Posted

技术标签:

【中文标题】如何清除导航堆栈?【英文标题】:How do I clear the Navigation stack? 【发布时间】:2015-04-13 04:03:37 【问题描述】:

我的应用中有导航问题。我使用 xamarin.forms 如何清理我的导航堆栈。没有使用 Pop 和 push。我可以查看完整的导航堆栈吗?

【问题讨论】:

【参考方案1】:

在最新版本的 Xamarin.Forms 中,您可以使用

查看导航堆栈
Navigation.NavigationStack

因此你可以使用一个

var existingPages = Navigation.NavigationStack.ToList();
foreach(var page in existingPages)

    Navigation.RemovePage(page);

此代码必须进入导航页面或实现 INavigation 的代码后面的代码中。

更多信息Xamarin.Forms.INavigation Members

【讨论】:

太好了,我用的是旧版本,没有 NavigationStack @ibrahim 您可以通过 nuget 升级您的版本。转到项目中的引用并右键单击并单击管理 nuget 包。然后选择更新并安装 Xamarin.Forms 更新 是的,我知道,我刚刚写了问题的原因。因为用这个问题的新版本是愚蠢的。谢谢 当我从中删除一页时,NavigationStack 会变​​空一段时间。 我希望他们在 Prism.Forms 中实现这一点。【参考方案2】:

这是我用来清空堆栈并导航到指定页面的函数。 (用例是应用在使用过程中被停用,我需要将用户踢出去)

    public async Task PopAllTo(ViewModel vm)
    
        if (vm == null) return;
        Page page = PreparePage(vm); //replace 'page' with the page you want to reset to
        if (page == null) return;
        _navigation.InsertPageBefore(page, _navigation.NavigationStack.First());
        await _navigation.PopToRootAsync();
    

【讨论】:

完美运行【参考方案3】:

你可以试试这个……

    public void ResetNavigationStack()
    
        if (_navigation != null && _navigation.NavigationStack.Count() > 0)
        
            var existingPages = _navigation.NavigationStack.ToList();
            foreach (var page in existingPages)
            
                _navigation.RemovePage(page);
            
        
    

然后轰隆隆!!!导航堆栈被清除了兄弟!

或者如果你想重置模态堆栈

    public async Task<Page> PopAllModals()
    
        Page root = null;

        if (_navigation.ModalStack.Count() == 0)
            return null;

        for (var i = 0; i <= _navigation.ModalStack.Count(); i++)
        
            root = await _navigation.PopModalAsync(false);
        
        return root;
    

然后砰!那些模态已经消失了!

【讨论】:

【参考方案4】:

对于 2020 年观看此内容的任何人:

await Navigation.PopToRootAsync();

或者如果您使用 Shell 导航

await Shell.Current.Navigation.PopToRootAsync();

【讨论】:

我正在使用 Shell.. 当我尝试这个时,它会将我重定向到根页面。但我需要清除堆栈并重定向到特定页面。 您是否尝试过在 PopToRootAsync() 之后使用 GoToAsync()?例如:await Shell.Current.GoToAsync("//animals/monkeys");

以上是关于如何清除导航堆栈?的主要内容,如果未能解决你的问题,请参考以下文章

清除返回堆栈导航 Windows 10

如何清除导航堆栈以使后退按钮不出现?

在 Swift 中清除导航堆栈

Ionic 4 Angular 路由器导航并清除上一页的堆栈/历史记录

如何清除背压事件的活动堆栈跟踪?

推送 ViewController 时清除 navigationController 堆栈