重定向导航的NullReferenceException解决方案陷入连续循环中

时间:2011-11-22 11:23:35

标签: windows-phone-7 navigation nullreferenceexception

大家,

与大多数应用程序一样,如果设置了密码,我需要为我的应用程序包含一个登录页面。应用程序的预期行为是,只有设置了密码,它才会导航到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");
        }
    }

有什么建议吗?

Alfah

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

我管理这样解决它,

我不知道它是否是正确的方法。但它的确有效。首先,我将默认的起始页面更改为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

Alfah