【问题标题】:How to implement an onboarding page with Prism.Forms?如何使用 Prism.Forms 实现入职页面?
【发布时间】:2018-04-28 07:21:19
【问题描述】:

我正在开发一个带有 PrismXamarin.Forms 应用程序,我想在其中加入一个入职页面(更具体地说,是一个顶级用户福利页面,在 @ 987654321@)。

应用程序本身是围绕 NavigationPage 构建的,我使用它导航到

NavigationService.NavigateAsync("/NavigationRootPage/MainPage")

在我的App()。在第一次开始时,我想改为显示入职页面,但在正确处理它时遇到了很多问题。

我的第一种方法是导航到MainPage

_navigationService.NavigateAsync("/NavigationRootPage/MainPage")

在我的视图模型中,当用户单击开始! 按钮时。这种工作方式也很丑陋,因为这种绝对导航会立即破坏引导页面并且不会为过渡设置动画。此外,在登录页面被销毁的那一刻,MainPage 将被构建,这将花费少量但值得注意的时间。实际上,用户会注意到 MainPage 正在构建,看起来一点也不流畅。

我的第二种方法是从我的视图模型中以相对方式导航。

_navigationService.NavigateAsync("NavigationRootPage/MainPage")

使用过渡动画效果更流畅,动画完成后,MainPage 已经准备就绪。但同样有一个主要缺点。您可以导航回 onbaording 页面,我们也不想要。而且 - 据我所知 - 也没有(干净的)方法可以从导航堆栈中删除页面。我尝试在我的入职页面上调用PageUtility.DestroyPage,但这只会让事情变得更糟,因为它似乎保留了页面,但破坏了视图模型,导致我的入职页面在按下后退按钮时显示没有数据。

我的第三种方法根本不起作用,尽管它对我来说似乎很有希望。在我的App() 中,我将导航页面与主页一起推送,然后是我的入职页面模式

NavigationService.NavigateAsync("/NavigationRootPage/MainPage");
NavigationService.NavigateAsync("OnboardingPage", useModalNavigation: true);

然后在我的视图模型中

_navigationService.GoBackAsync(useModalNavigation: true)

但是这种方法

  • 显示了 NavigationPage 的标题,尽管 onbaording 页面应该显示为模式
  • 拒绝GoBackAsync - 调用此方法时,没有任何反应

等待第一次调用NavigateAsync 也没有改变任何东西。

一些其他事情我尝试过

  • 在我的视图模型中实现了INavigationOptionsClearNavigationStackOnNavigationtrue
  • 在我的NavigationPage 显示后尝试设置Application.MainPage,但无济于事

我会相信这是编写应用程序时的常见要求。有什么我错过的吗?还是我必须忍受这些缺点之一?

【问题讨论】:

    标签: xamarin.forms navigation prism


    【解决方案1】:

    我认为你想多了。如果您想先显示您的 Onborading 页面,请先导航到该页面。

    `NavigateAsync("NavigationPage/OnboardingPage");

    或者,如果您想在堆栈中拥有 MainPage,则使用深度链接启动应用程序

    `NavigateAsync("NavigationPage/MainPage/OnboardingPage");

    如果您不想显示导航标题,只需将其隐藏以供入门页面使用。

    除非您想完全重置导航堆栈(相当于MainPage = new MainPage()),否则不要使用绝对导航。

    【讨论】:

    • 可能想太多了 ;) 就像一个魅力,但我仍然想知道为什么我不能用GoBackAsync关闭一个模态@
    • 我认为这也解决了我正要解决的另一个问题。非常感谢
    【解决方案2】:

    已经找到了一个解决方案,它不是最漂亮的解决方案(它实际上是相当丑陋的),但是很有效。

    在我的MainPages 视图模型中,我实现了INavigatingAware 并以模态方式导航到我的OnboardingPage

    public async void OnNavigatingTo(NavigationParameters parameters)
    {
        await _navigationService.NavigateAsync("LandingPage", useModalNavigation: true);
    }
    

    但是,使用

    删除 moal 页面
    this._navigationService.GoBackAsync(useModalNavigation: true);
    

    没有按预期工作。模态不会被删除(尽管从代码来看它应该以这种方式工作,但我没有设法使用 Re# 生成的 PDB 进行调试)。因此,我不得不采用丑陋(非 MVVM)的方式并为 Button.Click 创建一个事件处理程序并手动删除模式

    private void Button_OnClicked(object sender, EventArgs e)
    {
        this.Navigation.PopModalAsync();
    }
    

    这将通过动画顺利返回到我的MainPage,并且我的MainPage 已经启动并运行,而不是在已经可见的情况下构建。

    不过,我希望能得到关于如何以 Prism 方式进行操作的答案。

    【讨论】:

      猜你喜欢
      • 2019-06-23
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-01
      • 2019-06-02
      • 1970-01-01
      相关资源
      最近更新 更多