带有Prism的Xamarin表单:从堆栈中删除页面

时间:2017-07-13 15:15:45

标签: xamarin.forms prism

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

如何使用Xamarin Forms中的Prism导航服务?

4 个答案:

答案 0 :(得分:3)

人们在这个场景中遇到了一些情况。

作为一个常见示例,假设您有一个LoginPage,并且一旦用户成功登录,您就想要导航到MainPage。您的代码可能如下所示:

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

我这样做,更简单。

navigationService.NavigateAsync(“ ../ PageB”);

我正在使用Prims 7.0.0.396。

答案 3 :(得分:0)

  

给出:“ NavigationPage / ViewA / ViewB / ViewC / ViewD”

     

使用以下方法从ViewD导航:   NavigationService.NavigateAsync(“ ../../../ ViewE”);

     

结果为:“ NavigationPage / ViewA / ViewE”

引自here

需要棱镜> = 7.0