0

我正在尝试使用 Xamarin Forms 和 Prism 实现登录场景。

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

我想要做的是将显示的HomeMasterDetailPage页面内容设置为LoginPage. 当用户登录时,内容应更改为HomeDetailContentPage. LoginPage使用后退按钮应该无法返回。

我正在使用 Prism Forms 的 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>();

    }

}

如果用户尚未登录,这将正确显示其中的LoginPage内容,HomeMasterDetailPage如果用户已登录,则HomeDetailContentPage显示相同HomeMasterDetailPage的内容。

实际登录时出现问题;以下是视图模型中的代码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) 位于堆栈的顶部和底部,然后允许我从那里继续前进。相反,我得到了一个未处理的异常(在 Android 7.0 上)。

我究竟做错了什么?

注意:我看到的所有示例MasterDetailPage的根目录都设置为NavigationPage/ContentPage; 当我尝试这个时,我没有遇到异常,但是侧边菜单在其中的操作有所不同MasterDetailPage- 当您点击“汉堡包”时,侧边菜单会滑入所有内容(包括操作/标题栏),并且清除它的唯一方法是点击滑入的侧面菜单外部,而当我在操作/标题栏下方显示MasterDetailPage侧面NavigationPage菜单时,汉堡会变为一个箭头,您可以单击该箭头再次隐藏侧面菜单。

4

1 回答 1

0

我不能说我已经测试过这个确切的场景。但是,如果您的 LoginPage 是 MasterDetailPage 的详细信息,您可能不想从 LoginPage 执行导航。您可以改为创建一个SuccessfulLoginEvent,然后使用 从 LoginPage 发布它IEventAggregator,并在 MasterDetailPage 的 ViewModel 上订阅。然后您可以执行导航_navigationService.NavigateAsync("NavigationPage/ViewA"),它应该重置详细信息,以便后退按钮不会将您带到 LoginPage。

或者,您可以简单地执行具有以下效果的绝对导航: Application.Current.MainPage = new MyPage()

为此,您可以从任何地方进行导航,如下所示: _navigationService.NavigateAsync("/MyMasterDetailPage/NavigationPage/ViewA")

于 2017-04-29T16:29:47.893 回答