簡體   English   中英

Xamarin形式和棱鏡導航歷史

[英]Xamarin Forms and Prism Navigation history

我正在使用MVVM體系結構中的Prism框架開發Xamarin.Forms應用程序。 在每個頁面中,我都使用INavigationService對象進行導航,如下所示:

_navigationService.NavigateAsync("PageB");

在應用程序的左下角,我具有返回按鈕,可以返回頁面。

我有這樣的導航:

主頁-> PageA-> PageB-> PageC-> PageD

當我進入PageD時,我需要一個跳轉到PageA的按鈕,但是我需要保留部分導航歷史記錄,如下所示:

主頁-> PageA

我該怎么做?

NavigationService一次只能處理從NavigationStack中彈出單個視圖的問題。 這為您的方案提供了兩種選擇:

  1. _navigationService.NavigateAsync("/MainPage/PageA")會將您帶回到所需的視圖,但將重新創建MainPage和PageA。

  2. 可能更好的選擇是將NavigationParameters與INavigatedAware一起使用。 為此,“返回”命令可能會執行以下操作

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

然后,您可以更新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;
        }
    }
}

您需要執行絕對導航。 這是通過在您的uri前面加上“ /”來完成的。

_navigationService.NavigateAsync("/MainPage/PageA")

這將重置您的App.MainPage

======================更新=========================

您需要在Container中注冊所有頁面。 因此,請確保在我的代碼下方輸入您的App文件代碼:

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

最后,我用以下代碼解決了問題:

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

我希望它對某人有用。

使用相對導航。 如果您知道自己位於前三頁,則可以簡單地相對瀏覽至目標頁。

// 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM