Xamarin Forms with Prism:从堆栈中删除页面
Xamarin Forms with Prism: Remove a page from the stack
当我从页面 A 导航到页面 B 时,我需要删除页面 A。
如何使用 Xamarin Forms 中的 Prism 导航服务执行此操作?
人们 运行 对此有一些看法。
举一个常见的例子,假设您有一个登录页面,一旦用户成功登录,您就想导航到主页面。您的代码可能如下所示:
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;
}
}
}
另一种方法是让您的页面实现 INavigationAware
并在 OnNavigatedFrom
中调用 Navigatin.RemovePage(this)
.
我就是这样做的,比较简单
navigationService.NavigateAsync("../PageB");
我正在使用 Prims 7.0.0.396。
Given: "NavigationPage/ViewA/ViewB/ViewC/ViewD"
Navigate from ViewD with:
NavigationService.NavigateAsync("../../../ViewE");
Results in: "NavigationPage/ViewA/ViewE"
引用自here
需要棱镜 >= 7.0
当我从页面 A 导航到页面 B 时,我需要删除页面 A。
如何使用 Xamarin Forms 中的 Prism 导航服务执行此操作?
人们 运行 对此有一些看法。
举一个常见的例子,假设您有一个登录页面,一旦用户成功登录,您就想导航到主页面。您的代码可能如下所示:
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;
}
}
}
另一种方法是让您的页面实现 INavigationAware
并在 OnNavigatedFrom
中调用 Navigatin.RemovePage(this)
.
我就是这样做的,比较简单
navigationService.NavigateAsync("../PageB");
我正在使用 Prims 7.0.0.396。
Given: "NavigationPage/ViewA/ViewB/ViewC/ViewD"
Navigate from ViewD with: NavigationService.NavigateAsync("../../../ViewE");
Results in: "NavigationPage/ViewA/ViewE"
引用自here
需要棱镜 >= 7.0