我正在尝试用Xamarin窗体和Prism实现一个登录场景。
我的应用程序根页面是一个MasterDetail页面(HomeMasterDetailPage),用于提供侧菜单。
我要做的是让HomeMasterDetailPage页面显示,并将内容设置为LoginPage实例。当用户登录时,内容应该更改为HomeDetailContentPage的实例。不应该可以使用back按钮返回到LoginPage。
我正在使用来自棱镜表单的NavigationService。
我的起点是这样的..。
public partial class App : PrismApplication {
public App(IPlatformInitializer initializer = null)
: base(initializer) {
}
protected override void OnInitialized() {
InitializeComponent();
Uri uri = new Uri($"/{nameof(NavigationPage)}/{nameof(HomeMasterDetailPage)}/{nameof(HomeDetailContentPage)}", UriKind.Absolute);
var settings = Container.Resolve<SettingsService>();
if (!settings.DeviceUserID.HasValue)
uri = new Uri($"/{nameof(NavigationPage)}/{nameof(HomeMasterDetailPage)}/{nameof(LoginPage)}", UriKind.Absolute);
NavigationService.NavigateAsync(uri);
}
protected override void RegisterTypes() {
Container.RegisterTypeForNavigation<NavigationPage>();
Container.RegisterTypeForNavigation<LoginPage, LoginPageViewModel>();
Container.RegisterTypeForNavigation<HomeMasterDetailPage, HomePageViewModel>();
Container.RegisterTypeForNavigation<HomeMasterContentPage>();
Container.RegisterTypeForNavigation<HomeDetailContentPage>();
}
}如果用户尚未登录,则正确地显示HomeMasterDetailPage中的HomeDetailContentPage;如果用户登录,则在同一HomeMasterDetailPage中正确显示HomeDetailContentPage。
问题出现在实际登录时;以下是LoginPage视图模型中的代码.
protected async Task ExecuteLoginCommand() {
Uri uri = new Uri($"/{nameof(NavigationPage)}/{nameof(HomeMasterDetailPage)}/{nameof(HomeDetailContentPage)}", UriKind.Absolute);
await this.navigationService.NavigateAsync(uri);
}我的理解是,通过使用绝对Uri,这应该会重置导航,以便新的页面安排(/NavigationPage/HomeMasterDetailPage/HomeDetailContentPage)位于堆栈的顶部和底部,从而允许我从那里继续前进。相反,我得到了一个未处理的异常(在Android7.0上)。
我做错了什么?
注意:我看到的所有示例在根目录上都有MasterDetailPage,内容被设置为NavigationPage/ContentPage;当我尝试这样做时,不会出现异常,但是侧菜单在MasterDetailPage中的操作方式不同--当您点击“汉堡包”时,边菜单会在所有东西(包括动作/标题栏)上滑动,而唯一的清除方法是点击侧边菜单之外的滑块,而当我在NavigationPage中显示MasterDetailPage时,侧菜单在动作/标题栏下面滑动,汉堡包更改为箭头,您可以单击该箭头再次隐藏侧菜单。
发布于 2017-04-29 16:29:47
我不能说我测试过这个精确的场景。但是,如果LoginPage是MasterDetailPage的详细信息,则可能不希望从LoginPage执行导航。您可以创建一个SuccessfulLoginEvent,然后使用LoginPage使用IEventAggregator发布它,然后在MasterDetailPage的ViewModel上订阅。然后,您可以以_navigationService.NavigateAsync("NavigationPage/ViewA")的形式执行导航,并且它应该重置细节,这样后退按钮就不会将您带到LoginPage。
或者,您可以简单地执行效果为:Application.Current.MainPage = new MyPage()的绝对导航。
要做到这一点,您可以在任何地方进行导航,如:_navigationService.NavigateAsync("/MyMasterDetailPage/NavigationPage/ViewA")
https://stackoverflow.com/questions/43684332
复制相似问题