【问题标题】:Automatic navigation to next page fails in Windows Store App在 Windows 应用商店应用程序中自动导航到下一页失败
【发布时间】:2014-07-21 13:39:28
【问题描述】:

我在 Windows 应用商店应用程序 (Windows 8.1) 中有一个页面 X,该页面在初始屏幕后显示。我想在页面加载时/之后评估某些内容,然后用户才能与页面交互。

根据评估,我想做两者之一:

  1. 仅向用户显示页面 X,并且仅在用户单击按钮时导航到页面 Y
  2. 跳过当前页面并自动导航到页面 Y

1 工作正常。

2 没有。我尝试在构造函数中调用 this.Frame.Navigate(typeof(Y)) ,但它不起作用,因为 this.Frame 仍然为空。然后我尝试在 LoadState 和 OnNavigatedTo 中调用它,但是虽然在这两种情况下 this.Frame 都不为 null,但 Navigate() 方法返回 false,这意味着导航失败。我尝试进入调试中的方法,但它不起作用(?)。

一个提示是,当自动调用 Navigate() 代码行中的断点时,屏幕仍然显示启动画面,因此似乎 UI 元素尚未加载。所以最后一个问题是:如何在加载所有元素的情况下进行评估和自动导航(或者只是让它工作)?

【问题讨论】:

    标签: c# xaml windows-runtime windows-store-apps windows-8.1


    【解决方案1】:

    我不明白您为什么会在 OnNavigatedFrom 中调用 Frame.Navigate(...),但我可以建议两个适合我的选项:

    1. 导航到OnNavigatedTo 中的第二页:虽然这不是开箱即用的,但在指示调度员进行导航时可以:

      public sealed partial class MainPage : Page
      {
          public MainPage()
          {
              this.InitializeComponent();
          }
      
          protected override void OnNavigatedTo(NavigationEventArgs e)
          {
              base.OnNavigatedTo(e);
      
              this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
              {
                  this.Frame.Navigate(typeof(SecondPage));
              });
          }
      }
      
    2. 更简单的解决方案是在首页的Loaded 事件中进行导航:

      public sealed partial class MainPage : Page
      {
          public MainPage()
          {
              this.InitializeComponent();
      
              this.Loaded += (sender, args) =>
              {
                  this.Frame.Navigate(typeof(SecondPage));
              };
          }
      }
      

    当然,在这两种情况下,您都可以在调用 Frame.Navigate(...) 之前在 lambda 表达式中添加您喜欢的任何计算

    编辑:作为第三种选择,也许您应该考虑将计算和决策部分移动到 App.xaml.cs 中的OnLaunched,并将第一页或第二页作为根页加载,而不是打开第一页页面并立即导航到第二个页面?

    【讨论】:

    • 非常感谢,这正是我想要的。解决方案 1 完美运行。几件事:1)我的意思是 OnNavigatedTo 而不是 ~From,在我的问题中编辑了它。 2)稍后我可能会尝试向加载的事件添加处理程序。实际上,这就是我正在寻找的事件。我怎么会知道呢?我想我必须像 OnNavigatedTo 等一样覆盖它们。 3)谢谢建议,但我想在计算过程中显示一个进度条等,也可能在应用程序启动时使用其他页面的代码.再次感谢!
    • 对不起,我有点太快了。导航现在可以工作(使用方法 1 和 2)。但是没有显示页面的 UI 元素(在这两种方法中都没有)。所以 Loaded 事件似乎在页面的 UI 元素加载之前被触发?如何加载并实际显示页面、显示进度条并在计算后自动导航到下一页?
    • 你是对的,它只是在计算时显示启动画面而不是第一页。但是,您应该能够结合这两种方法并在 Loaded 事件中使用 Dispatcher.RunAsync(...) 版本。刚刚测试了一下,它会显示加载屏幕(或第一页上的任何内容),然后切换到第二页。
    • 我有,但我使用“Task.Delay(2000).Wait()”作为假计算,而不是“await Task.Delay(2000)”。使用 await 一切正常(旨在不使用 Wait() 阻塞 UI)。即使您提到的第一种方法也有效(不使用 Loaded 事件,而是在 OnNavigatedTo() 和 navigationHelper_LoadState() 中导航。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多