【问题标题】:Xamarin.Forms, using the Prism.Forms NavigationServiceXamarin.Forms,使用 Prism.Forms NavigationService
【发布时间】:2017-09-26 19:35:01
【问题描述】:

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

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

我想要做的是将带有 ContentHomeMasterDetailPage 页面设置为 LoginPage 的实例。当用户登录时,Content 应更改为 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>();

    }

}

如果用户尚未登录,这将正确显示HomeMasterDetailPage 中的LoginPage,如果用户已登录,则正确显示同一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) 位于堆栈的顶部和底部,然后允许我从那里继续前进.相反,我得到了一个未处理的异常(在 Android 7.0 上)。

我做错了什么?

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

【问题讨论】:

    标签: xamarin.forms prism-6


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢丹,我想我基本上是按照你在回答末尾的建议做的(请参阅我上面的 ExecuteLoginCommand 代码)——只是我有 NavigationPage 和 MasterDetailPage (为了从 MasterDetailPage 中获得正确的行为,如前所述)。不是这样吗?
    • 查看samples,了解如何使用 MasterDetailPage。您很可能希望您的详细信息包含在 NavigationPage 而不是 MasterDetailPage 中。
    • 我将您的答案标记为正确,主要是针对 4 月 28 日 @ 19:19 的评论,它帮助我最终意识到我错误地使用了 MasterDetailPage 和 NavigationPage。一旦我意识到这一点,我就能够解决我在使用 Prism Navigation 服务时遇到的所有其他问题。
    猜你喜欢
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多