如何清除导航栈?

27

我在我的应用程序中遇到了导航问题。 我使用Xamarin.Forms,如何清理我的导航堆栈,而不使用Pop和Push。 我能否查看完整的导航堆栈?

4个回答

51
在最新版的Xamarin.Forms中,您可以使用以下方式查看导航栈:
Navigation.NavigationStack

因此,您可以使用一个。
var existingPages = Navigation.NavigationStack.ToList();
foreach(var page in existingPages)
{
    Navigation.RemovePage(page);
}

这段代码需要放在实现了INavigation接口的导航页或其他类的代码后面。

更多信息请参考Xamarin.Forms.INavigation成员


很好,我使用旧版并没有 NavigationStack。 - Ibrahim
@ibrahim,您可以通过NuGet升级您的版本。在项目中转到引用,右键单击并单击管理NuGet包。然后选择更新并安装Xamarin.Forms更新。 - JKennedy
是的,我知道。我只是写出了提出问题的原因。因为使用这个新版本的问题很愚蠢。谢谢。 - Ibrahim
2
当我从NavigationStack中删除一个页面时,它会在一段时间内变为空。 - Aneesh.A.M
我希望他们在Prism.Forms中实现这个。 - Shimmy Weitzhandler

12

这是我编写的一种函数,用于清空堆栈并导航到指定页面。 (使用情况是应用程序在使用过程中被停用,我需要将用户踢出)

    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();
    }

1
完美运行 - Thiago Romam

9

如果有人在2020年查看此内容:

await Navigation.PopToRootAsync();

如果您使用 Shell 导航。
await Shell.Current.Navigation.PopToRootAsync();

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

7
你可以尝试这个...
    public void ResetNavigationStack()
    {
        if (_navigation != null && _navigation.NavigationStack.Count() > 0)
        {
            var existingPages = _navigation.NavigationStack.ToList();
            foreach (var page in existingPages)
            {
                _navigation.RemovePage(page);
            }
        }
    }

并且BOOOM!!!那个导航栈已经被清除了兄弟!

或者如果你想重置模态栈

    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;
    }

然后BOOOM!这些模态框就消失了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接