我正在使用MVVM架构中的Prism框架开发Xamarin.Forms应用程序。 在每个页面中,我使用INavigationService对象进行导航,如下所示:
_navigationService.NavigateAsync("PageB");
在应用程序的左下角,我有后退按钮,我可以返回页面。
我有这样的导航:
MainPage - > PageA - > PageB - > PageC - >分页
当我在PageD时,我需要一个跳转到PageA的按钮,但我需要保留部分导航历史记录,如下所示:
MainPage - >网页A
我怎么能这样做?
答案 0 :(得分:0)
NavigationService只能处理一次从NavigationStack弹出单个View。这为您的方案留下了两个选项:
_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;
}
}
}
答案 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