【发布时间】:2017-12-18 11:36:45
【问题描述】:
当我从页面 A 导航到页面 B 时,我需要删除页面 A。
如何使用 Prism 在 Xamarin Forms 中的导航服务做到这一点?
【问题讨论】:
标签: xamarin.forms prism
当我从页面 A 导航到页面 B 时,我需要删除页面 A。
如何使用 Prism 在 Xamarin Forms 中的导航服务做到这一点?
【问题讨论】:
标签: xamarin.forms prism
人们在这方面会遇到几种情况。
作为一个常见示例,假设您有一个 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;
}
}
}
【讨论】:
MainPage\PageA 转到MainPage\PageB,但没有重新初始化MainPage,所以基本上我只想在转到PageB 时删除PageA。我正在尝试找出您的解决方案,但现在我无法真正理解它。为什么OnViewBCommandExecuted你回去?
PageA 上,所以我返回到MainPage,向它传递一个参数,让MainPage 知道我想导航到PageB。这使我能够正确导航。如果我想将额外的 NavigationParameters 从 PageA 传递到 PageB,当我从 MainPage 进行导航时,我只需将参数传递到那里。
/MainPage/PageA 如果 Uri 已经“存在”,这意味着导航堆栈看起来完全一样,那么不要实例化它们?因为根据我的尝试(我认为您在第一个示例中已经说过),它会重置并重新创建 MainPage 和 PageA。
给定:“NavigationPage/ViewA/ViewB/ViewC/ViewD”
从 ViewD 导航: NavigationService.NavigateAsync("../../../ViewE");
结果:“NavigationPage/ViewA/ViewE”
转自here
需要棱镜 >= 7.0
【讨论】:
另一种方法是让您的页面实现INavigationAware,并在OnNavigatedFrom 中调用Navigatin.RemovePage(this)。
【讨论】:
我是这样做的,比较简单。
navigationService.NavigateAsync("../PageB");
我正在使用 Prims 7.0.0.396。
【讨论】: