Xamarin形式和棱镜导航历史

时间:2017-08-31 15:33:36

标签: c# mvvm xamarin.forms prism

我正在使用MVVM架构中的Prism框架开发Xamarin.Forms应用程序。 在每个页面中,我使用INavigationService对象进行导航,如下所示:

_navigationService.NavigateAsync("PageB");

在应用程序的左下角,我有后退按钮,我可以返回页面。

我有这样的导航:

MainPage - > PageA - > PageB - > PageC - >分页

当我在PageD时,我需要一个跳转到PageA的按钮,但我需要保留部分导航历史记录,如下所示:

MainPage - >网页A

我怎么能这样做?

4 个答案:

答案 0 :(得分:0)

NavigationService只能处理一次从NavigationStack弹出单个View。这为您的方案留下了两个选项:

  1. _navigationService.NavigateAsync("/MainPage/PageA")这会将您带回到您想要的视图,但会重新创建MainPage和PageA。

  2. 可能更好的选择是使用NavigationParameters和INavigatedAware。要执行此操作,您的“返回”命令可能会执行类似

    的操作

    _navigationService.GoBackAsync(new NavigationParameters {     {" goBackTo" :" PageA" } });

  3. 然后,您可以更新ViewModel以执行以下操作:

    public class PageBViewModel : BindableBase, INavigationAware
    {
        public const string Key = "PageB";
    
        public void OnNavigatedTo(NavigationParameters parameters)
        {
            switch(parameters.GetNavigationMode())
            {
                case NavigationMode.Back:
                    var goBackTo == parameters.GetValue<string>("goBackTo");
                    if(!string.IsNullOrWhiteSpace(goBackTo) && goBackTo != Key)
                    {
                        _navigationService.GoBackAsync(parameters);
                        return;
                    }
                    break;
            }
        }
    }
    

答案 1 :(得分:0)

您需要执行绝对导航。 这是通过在uri上加上&#34; /&#34;。

前缀来完成的
_navigationService.NavigateAsync("/MainPage/PageA")

这将重置您的App.MainPage

<强> =======================修订==================== =====

您需要在Container中注册所有页面。 因此,请确保您的应用程序文件代码位于我的代码下方:

public partial class App : PrismApplication
{
    public App(IPlatformInitializer initializer = null) : base(initializer) { }
    protected override void OnInitialized()
    {
        InitializeComponent();
        NavigationService.NavigateAsync("NavigationPage/MainPage");
    }
    protected override void RegisterTypes()
    {
        Container.RegisterTypeForNavigation<MainPage>();
        Container.RegisterTypeForNavigation<PageA>();
        Container.RegisterTypeForNavigation<PageB>();
        Container.RegisterTypeForNavigation<PageC>();
        Container.RegisterTypeForNavigation<PageD>();
        Container.RegisterType<ITsApiService, TsApiService>();
    }
}

答案 2 :(得分:0)

最后我用这段代码解决了问题:

_navigationService.NavigateAsync("/NavigationPage/MainPage/PageA", null,false,false);

我希望它对某人有用。

答案 3 :(得分:0)

使用相对导航。 如果您知道自己位于前三页,则只需相对导航至目标页即可。

// using 3x '..'
_navigationService.NavigateAsync("../../..");

/* 

Current stack: MainPage -> PageA -> PageB -> PageC -> PageD

..          -> MainPage -> PageA -> PageB -> PageC
../..       -> MainPage -> PageA -> PageB
../../..    -> MainPage -> PageA  

*/

您还可以向后导航四次,然后导航至创建以下导航堆栈的其他页面(基本上替换PageA):

_navigationService.NavigateAsync("../../../../AnotherPage"); // -> MainPage/AnotherPage