【问题标题】:App can't Navigate to MainPage应用程序无法导航到主页
【发布时间】:2014-10-06 11:54:29
【问题描述】:

我的 WP8.1 RT 应用程序遇到了一个奇怪的问题 - 我的一位 Beta 测试人员报告说,他在启动画面之后看到黑屏。该应用程序不会崩溃,挂起电话或其他 - 只是黑屏而不是 MainPage。 我在代码中实现了一些 Trace 方法来跟踪问题。代码如下所示:

// OnLaunched method that gets called when the App starts
protected async override void OnLaunched(LaunchActivatedEventArgs e)
{
    await Trace.WriteLineAsync(true, "Launched");
    Frame rootFrame = CreateRootFrame();
    await Trace.WriteLineAsync(true, "Before - better checkup");
    if (rootFrame.Content == null)
    {
        await Trace.WriteLineAsync(false, "Rootframe content was null, navigating");
        if (!rootFrame.Navigate(typeof(MainPage), e.Arguments))
            await Trace.WriteLineAsync(false, "Navigation false");
        else await Trace.WriteLineAsync(false, "Navigation was ok");
    }
    await Trace.WriteLineAsync(true, "After - better checkup");
    Window.Current.Activate();
} 

// Method creating the rootFrame:
private Frame CreateRootFrame()
{
    Trace.WriteLineAsync(true, "Create Root frame");
    Frame rootFrame = Window.Current.Content as Frame;
    if (rootFrame == null)
    {
        Trace.WriteLineAsync(true, "Root frame was null");
        rootFrame = new Frame();
        SuspensionManager.RegisterFrame(rootFrame, "AppFrame");
        rootFrame.NavigationFailed += OnNavigationFailed;
        Window.Current.Content = rootFrame;
        Trace.WriteLineAsync(false, "Window content {0}", Window.Current.Content.ToString());
    }
    return rootFrame;
}

beta 测试人员获得的日志如下所示:

2014-10-06 13:02:56: Launched
2014-10-06 13:02:56: Create Root frame
2014-10-06 13:02:56: Root frame was null
Window content Windows.UI.Xaml.Controls.Frame
2014-10-06 13:02:57: Before - better checkup
Rootframe content was null, navigating
Navigation false
2014-10-06 13:02:57: After - better checkup
2014-10-06 13:03:01: App.cs suspending event

如您所见,最重要的行是Navigation false,这意味着

if (!rootFrame.Navigate(typeof(MainPage), e.Arguments))
     await Trace.WriteLineAsync(false, "Navigation false");

Navigation 返回 false - 我无法在我的 Frame 内导航,没有崩溃,没有挂起 - (暂停事件有效),只是无法访问 MainPage。我完全不知道问题的根源是什么。此外 - 在我的手机上一切正常,其他设备也 - 调试和发布。

有人知道为什么我无法导航到我的主页吗?

编辑 - 添加了导航失败事件:

void OnNavigationFailed(object sender, NavigationFailedEventArgs e)
{
    Trace.WriteLineAsync(true, "Failed to load page");
    throw new Exception("Failed to load Page " + e.SourcePageType.FullName);
}

【问题讨论】:

  • NavigationFailed 处理程序(“OnNavigationFailed”)有什么作用?事件的 NavigationFailedEventArgs 是否报异常?是否将 Handled 设置为 true?
  • @WillemvanRumpt NavigationFailed(我添加了一个编辑)未被调用 - 日志中没有任何迹象,也没有抛出异常 - 应用程序不会崩溃。
  • 我曾经经历过类似的事情,但那是前一段时间了。 IIRC,然后问题涉及两个相互依赖的静态初始化程序,以及异步调用(这有效地阻止了执行,因为两者都无法初始化)。您的项目中是否有类似(-ish)的场景?
  • @WillemvanRumpt 我怀疑是这种情况(我会仔细看看) - 用户可以等待几秒钟,然后单击开始按钮 - 应用程序被正确挂起 - 事件被调用,这意味着它没有被阻止。我还把 Trace 放在 MainAPge 构造函数中——它没有被调用——为什么,我不知道。该案例(就目前而言)仅涉及一台设备,在其他设备上运行良好。
  • 仅仅因为Navigate方法没有处理和抛出异常并不意味着没有抛出异常。如果您调试应用程序并检查调试输出,您可能会看到一个 NullReferenceException 或数百个其他异常被抛出然后在 Navigate 方法中捕获。它不会使应用程序崩溃,也不会触发 UnhandledException 中断。查看调试输出。

标签: c# windows-runtime windows-phone windows-phone-8.1


【解决方案1】:

感谢Nate Diamond comment 我开始寻找问题的原因,方式略有不同。我添加了这个答案,因为有一天它可能会对某人有所帮助。

经过多次尝试和 beta 测试人员的帮助,最终发现问题是由在页面构造函数之前初始化的变量之一引起的。初始化导致异常被 Navigate 方法吞噬,因此返回 false。

另一件事是初始化导致异常的原因,但这是另一回事。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    相关资源
    最近更新 更多