代码之家  ›  专栏  ›  技术社区  ›  Noel

创建XAML启动页并导航到选项卡式页面

  •  0
  • Noel  · 技术社区  · 6 年前

    我几乎已经使用MVVMLight和以下工具设置了我的XF应用程序 this article

    我现在想介绍一个XAML启动页,通过将其分配给应用程序中的MainPage属性,在启动时加载它。xaml。cs。加载后,在启动页面中,我想执行一些异步任务来初始化应用程序,即从API获取初始数据等。完成后,我想导航到主选项卡页面。

    我还没有编写初始化逻辑,所以我正在使用线程。睡眠来模拟这一点。

    我读了很多文章,尝试了几件事,我陷入了这样的境地:我有以下问题之一:

    1. 启动页面加载,但不导航到选项卡式页面。
    2. 初始页面根本不加载,而是导航到选项卡式页面 直接地

    This article 是我遇到的最接近的,但我似乎在释放信号量时出错:

    05-09 19:22:12.471 I/MonoDroid(14342): System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Threading.SemaphoreFullException: Adding the specified count to the semaphore would cause it to exceed its maximum count.
    05-09 19:22:12.471 I/MonoDroid(14342):   at System.Threading.SemaphoreSlim.Release (System.Int32 releaseCount) [0x0004c] in <fcbf47a04b2e4d90beafbae627e1fca4>:0 
    05-09 19:22:12.471 I/MonoDroid(14342):   at System.Threading.SemaphoreSlim.Release () [0x00000] in <fcbf47a04b2e4d90beafbae627e1fca4>:0 
    

    感谢您对上述内容或如何使用xaml实现启动页的任何建议(如果这在概念上有意义的话),因为大多数文章都是在本机项目中使用本机实现或图像。

    提前谢谢。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Noel    6 年前

    好啊所以我找到了导航,也不需要担心信号量。

    以下步骤详细说明了答案:

    1. 在服务类或单独的类中创建长时间运行的方法,如下所示

      public async Task LongRunning()
      {
          //Write code to download data from an API or something.
      }
      
    2. 创建“SplashPage”。并将其分配给应用程序中的MainPage属性。cs。这会将SplashPage设置为NavigationStack中的第一页或根页。

    3. 如果MVVMLight正在按照 link 然后:

      a、 创建SplashViewModel。cs文件。

      b、 在SplashViewModel中。cs,创建一个名为Initialize的私有异步void方法,该方法具有以下代码:

      private async void Initialize()
      {
          //Need to await till the task is done. Very important
          await yourService.LongRunning();
      
          //Only after task is done should it navigate to next page
          NavigationService.NavigateTo(nameof(MainTabbedPage));
      }
      
    4. 导航到MainTabbedPage后,MainTabbedPage将成为导航堆栈中的第二个页面。不应出现这种情况,因为第一页或根页应始终是MainTabbedPage。此外,无需再次导航到SplashPage。为了解决这个问题,将下面的代码放在主选项卡页的OnAppearing事件中。

      protected override void OnAppearing()
      {
          base.OnAppearing();
          var splashPage = Navigation.NavigationStack[0];
          Navigation.RemovePage(splashPage);
      }
      

      这将从导航堆栈中删除SplashPage,并在导航到任何其他页面之前将MainTabbedPage设置为根页面。

    5. 如果您不使用MVVMLight,而是直接在代码隐藏或其他地方编写代码,那么步骤3b中的代码可以放在代码隐藏-SplashPage中。xaml。可以在构造函数中调用cs和Initialize方法。

    我花了相当长的时间来解决这个问题,所以我希望这能在需要时有所帮助。