首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Xamarin.Forms,使用Prism.Forms NavigationService

Xamarin.Forms,使用Prism.Forms NavigationService
EN

Stack Overflow用户
提问于 2017-04-28 15:55:24
回答 1查看 574关注 0票数 0

我正在尝试用Xamarin窗体和Prism实现一个登录场景。

我的应用程序根页面是一个MasterDetail页面(HomeMasterDetailPage),用于提供侧菜单。

我要做的是让HomeMasterDetailPage页面显示,并将内容设置为LoginPage实例。当用户登录时,内容应该更改为HomeDetailContentPage的实例。不应该可以使用back按钮返回到LoginPage

我正在使用来自棱镜表单的NavigationService。

我的起点是这样的..。

代码语言:javascript
复制
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视图模型中的代码.

代码语言:javascript
复制
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时,侧菜单在动作/标题栏下面滑动,汉堡包更改为箭头,您可以单击该箭头再次隐藏侧菜单。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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")

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43684332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档