Xamarin Forms with Prism:从堆栈中删除页面

Xamarin Forms with Prism: Remove a page from the stack

当我从页面 A 导航到页面 B 时,我需要删除页面 A。

如何使用 Xamarin Forms 中的 Prism 导航服务执行此操作?

人们 运行 对此有一些看法。

举一个常见的例子,假设您有一个登录页面,一旦用户成功登录,您就想导航到主页面。您的代码可能如下所示:

public class App : PrismApplication
{
    protected override async void OnInitialized()
    {
        await NavigationService.NavigateAsync("LoginPage");
    }

    protected override void RegisterTypes()
    {
        Container.RegisterTypeForNavigation<LoginPage>();
        Container.RegisterTypeForNavigation<MainPage>();
    }
}

public class LoginPageViewModel : BindableBase
{
    public DelegateCommand LoginCommand { get; }

    private async void OnLoginCommandExecuted()
    {
        // Do some validation

        // Notice the Absolute URI which will reset the navigation stack
        // to start with MainPage
        await _navigationService.NavigateAsync("/MainPage");
    }
}

现在,如果您正在寻找的是您的导航堆栈看起来像 MainPage/ViewA 而您想要的是 MainPage/ViewB 并且您不想重新初始化 MainPage 的流程,那么这是我们目前正在评估并希望对此进行改进,以便您可以执行类似 _navigationService.NavigateAsync("../ViewB") 的操作。与此同时,我可能会建议是这样的:

public class ViewAViewModel : BindableBase
{
    public DelegateCommand ViewBCommand { get; }

    private async void OnViewBCommandExecuted()
    {
        var parameters = new NavigationParameters
        {
            { "navigateTo", "ViewB" }
        };

        await _navigationService.GoBackAsync(parameters);
    }
}

public class MainPageViewModel : BindableBase, INavigatedAware
{
    public async void OnNavigatingTo(NavigationParameters parameters)
    {
        if(parameters. GetNavigationMode() == NavigationMode.Back && 
           parameters.TryGetValue("navigateTo", out string navigateTo))
        {
            await _navigationService.NavigateAsync(navigateTo);
            return;
        }
    }
}

另一种方法是让您的页面实现 INavigationAware 并在 OnNavigatedFrom 中调用 Navigatin.RemovePage(this).

我就是这样做的,比较简单

navigationService.NavigateAsync("../PageB");

我正在使用 Prims 7.0.0.396。

Given: "NavigationPage/ViewA/ViewB/ViewC/ViewD"

Navigate from ViewD with: NavigationService.NavigateAsync("../../../ViewE");

Results in: "NavigationPage/ViewA/ViewE"

引用自here

需要棱镜 >= 7.0