C# 在Windows应用商店应用程序中自动导航到下一页失败

C# 在Windows应用商店应用程序中自动导航到下一页失败,c#,xaml,windows-runtime,windows-store-apps,windows-8.1,C#,Xaml,Windows Runtime,Windows Store Apps,Windows 8.1,我在Windows应用商店应用程序(Windows 8.1)中有一个X页,在启动屏幕后显示。我想在页面加载时/加载后,在用户可以与页面交互之前评估一些内容 根据评估结果,我希望执行以下两种操作之一: 只需向用户显示页面X,并仅在用户单击按钮时导航到页面Y 跳过当前页并自动导航到Y页 1行 2没有。我尝试在构造函数中调用this.Frame.Navigate(typeof(Y)),但由于this.Frame仍然为null,因此无法正常工作。然后我尝试在LoadState和OnNavigatedTo

我在Windows应用商店应用程序(Windows 8.1)中有一个X页,在启动屏幕后显示。我想在页面加载时/加载后,在用户可以与页面交互之前评估一些内容

根据评估结果,我希望执行以下两种操作之一:

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

    2没有。我尝试在构造函数中调用this.Frame.Navigate(typeof(Y)),但由于this.Frame仍然为null,因此无法正常工作。然后我尝试在LoadState和OnNavigatedTo中调用它,但是在这两种情况下,this.Frame都不是null,Navigate()方法返回false,这意味着导航失败。我试图在调试过程中逐步使用该方法,但没有成功(?)


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

    我不明白您为什么要调用
    Frame.Navigate(…)
    on navigated from
    中导航(…),但我可以建议两个适合我的选项:

  • 导航到
    on navigated to
    中的第二页:虽然这不适用于开箱即用,但在指示调度员进行导航时会起作用:

    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));
            });
        }
    }
    
  • 更简单的解决方案是在第一页加载的
    事件中进行导航:

    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
    
            this.Loaded += (sender, args) =>
            {
                this.Frame.Navigate(typeof(SecondPage));
            };
        }
    }
    
  • 当然,在这两种情况下,在调用
    Frame.Navigate(…)


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

    我不明白您为什么要调用
    Frame.Navigate(…)
    中的
    on导航自
    ,但我可以建议两个适合我的选项:

  • 导航到
    on navigated to
    中的第二页:虽然这不适用于开箱即用,但在指示调度员进行导航时会起作用:

    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));
            });
        }
    }
    
  • 更简单的解决方案是在第一页加载的
    事件中进行导航:

    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
    
            this.Loaded += (sender, args) =>
            {
                this.Frame.Navigate(typeof(SecondPage));
            };
        }
    }
    
  • 当然,在这两种情况下,在调用
    Frame.Navigate(…)


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

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