[英]Xamarin Forms and Prism Navigation history
我正在使用MVVM體系結構中的Prism框架開發Xamarin.Forms應用程序。 在每個頁面中,我都使用INavigationService對象進行導航,如下所示:
_navigationService.NavigateAsync("PageB");
在應用程序的左下角,我具有返回按鈕,可以返回頁面。
我有這樣的導航:
主頁-> PageA-> PageB-> PageC-> PageD
當我進入PageD時,我需要一個跳轉到PageA的按鈕,但是我需要保留部分導航歷史記錄,如下所示:
主頁-> PageA
我該怎么做?
NavigationService一次只能處理從NavigationStack中彈出單個視圖的問題。 這為您的方案提供了兩種選擇:
_navigationService.NavigateAsync("/MainPage/PageA")
會將您帶回到所需的視圖,但將重新創建MainPage和PageA。
可能更好的選擇是將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.