【问题标题】:NullReferenceException solution by redirection navigation caught up in a continuous loopNullReferenceException 解决方案通过重定向导航陷入连续循环
【发布时间】:2011-11-22 11:23:34
【问题描述】:

大家,

与大多数应用程序一样,如果设置了密码,我需要为我的应用程序包含一个登录页面。该应用程序的预期行为是,只有设置了密码,它才应该导航到 passwordpage.xaml,并且在输入正确的密码时,它应该导航到 mainpage.xaml。如果没有设置密码,应该直接导航到mainpage.xaml。

以下博客建议需要重新导航,以便在 app.xaml.cs 中包含一个检查,以确定应用需要导航到哪个页面。

但现在的问题是,没有从密码页面进行进一步的导航。它在设置密码时导航到密码页面,但在检查密码匹配后,它不会在 mainpage.xaml 上移动,而是返回到 rootframe_navigating 事件处理程序并执行循环。

http://blogs.msdn.com/b/ptorr/archive/2010/08/28/redirecting-an-initial-navigation.aspx

这是app.xaml.cs中的函数

    void RootFrame_Navigating(object sender, NavigatingCancelEventArgs e)
    {
        //throw new NotImplementedException();
        if (e.Uri.ToString().Contains("/MainPage.xaml") != true)
            return;
        CycleManager pCycMan = CycleManager.instance;
        bool checkOk = false;
        pCycMan.ReadFromIsolatedStorage();
        if (pCycMan.GetPasswordEnabled())
        {
            checkOk = true;
        }

        e.Cancel = true;
        RootFrame.Dispatcher.BeginInvoke(delegate
        {
            if (checkOk)
                RootFrame.Navigate(new Uri("/PasswordPage.xaml", UriKind.Relative));

            else
                RootFrame.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
        });
    }

这是写在passwordpage.xaml中按钮点击的函数

    private void OnClick(object sender, RoutedEventArgs e)
    {
        CycleManager pCycMan = CycleManager.instance;
        if (pCycMan.GetPassword() == passwordBox1.Password)
        {
            NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
        }
        else
        {
            MessageBox.Show("Incorrect Password");
        }
    }

有什么建议吗?

阿尔法

【问题讨论】:

    标签: windows-phone-7 navigation nullreferenceexception


    【解决方案1】:

    如果你要回到你所在页面后面的页面,你应该使用内置的NavigationService.GoBack() 方法。这让手机可以处理页面的后台堆栈。

    如果您需要前进但从不返回页面,那么在 Mango 中,您现在需要使用 NavigationService.RemoveBackEntry() 手动从后台堆栈中删除该页面。

    查看您的代码,导航处理程序将始终触发。您似乎正在检查是否启用了密码,而不是检查用户是否已通过身份验证。我只想说检查密码的逻辑是错误的。

    【讨论】:

    • +1 在这里。废弃您当前的方法并在主页的LoadedOnNavigatedTo 方法中执行检查/重定向到密码页面。然后在设置密码时GoBack()
    • @adam GoBack() 不能使用,因为在后台堆栈中没有条目,即它还没有导航到 mainpage.xaml。它检查 app.xaml 中的条件,然后移动到密码页面,然后它应该移动到 mainpage.xaml 但它不会移动到 mainpage.xaml
    • @alfah 这很可能是因为您正试图取消导航事件并在同一代码块中启动一个新事件。尝试使密码页面成为您的起始页面,这样您就不需要劫持导航处理程序......用户的第一眼将只是一个登录页面。然后,您可以向前导航并从后台弹出密码页面,从那时起,一切都应该是正常的行为。
    • @ChrisSainty 但是如果没有设置密码,为什么我们需要不必要地加载 mainpage.xaml?
    • @AdamHouldsworth 如果没有设置密码,我不需要显示密码页面,只需要显示 mainpage.xaml,所以需要进行某种检查,对吗?建议取消当前导航并为下一个刻度安排真正的导航,因为我们无法立即导航,因为这将失败。也不允许重叠导航。
    【解决方案2】:

    我设法这样解决了,

    我不知道它是否正确。但它有效。首先,我将默认起始页面更改为 WMAppManifest.xaml 中名为 RootPage.xaml 的不存在页面。然后在事件处理程序中,我将 MainPage.xaml 更改为 RootPage.xaml

    if (e.Uri.ToString().Contains("/RootPage.xaml") != true)
              return;
    

    我必须从 backstack 条目中删除密码页面,否则返回退出应用程序将再次带来密码页面。

    参考:http://www.markerstudio.com/technical/2010/09/windows-phone-7-how-to-always-launch-your-app-where-the-user-left-off/#comment-916

    阿尔法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-11
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多