使用NavigationService时出现NullreferenceException

时间:2012-09-14 15:29:00

标签: c# windows-phone-7 navigationservice

我的WP7应用遇到了问题:

我只是在应用程序无法检测到任何存储的用户名或密码值时才尝试创建登录页面提示;但是,当我尝试导航到我的登录页面时,我一直遇到NullReferenceException。

我的代码看起来像这样,它在构造函数中:

if (!checkLogin())
    {
        NavigationService.Navigate(new Uri("/LoginPage.xaml", UriKind.Relative));
    }

checkLogin只是一个返回true或false的函数,具体取决于是否正确设置了隔离存储设置。

有人有什么建议吗?

感谢。

1 个答案:

答案 0 :(得分:3)

这是我认为你想做的事情(From Peter Torr's blog)。

如果您需要更多说明,可以使用一段代码来说明这一点。假设有2页A.XAML和B.xaml,您可能希望根据检查存储在IsolatedStorage中的一些登录凭据来检测是否加载A.xaml或B.xaml,

项目的App.xaml.cs中的

使用以下内容覆盖public App()

    public App()
    {
        // Global handler for uncaught exceptions. 
        UnhandledException += Application_UnhandledException;

        // Standard Silverlight initialization
        InitializeComponent();

        // Phone-specific initialization
        InitializePhoneApplication();

        // Show graphics profiling information while debugging.
        if (System.Diagnostics.Debugger.IsAttached)
        {
            // Display the current frame rate counters.
            Application.Current.Host.Settings.EnableFrameRateCounter = true;

            // Show the areas of the app that are being redrawn in each frame.
            //Application.Current.Host.Settings.EnableRedrawRegions = true;

            // Enable non-production analysis visualization mode, 
            // which shows areas of a page that are handed off to GPU with a colored overlay.
            //Application.Current.Host.Settings.EnableCacheVisualization = true;

            // Disable the application idle detection by setting the UserIdleDetectionMode property of the
            // application's PhoneApplicationService object to Disabled.
            // Caution:- Use this under debug mode only. Application that disables user idle detection will continue to run
            // and consume battery power when the user is not using the phone.
            PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled;
        }

        RootFrame.Navigating += new NavigatingCancelEventHandler(RootFrame_Navigating);
    }

    void RootFrame_Navigating(object sender, NavigatingCancelEventArgs e)
    {
        if (e.Uri.ToString().Contains("/MainPage.xaml") != true)
        {
            return;
        }
        e.Cancel = true;
        RootFrame.Dispatcher.BeginInvoke(delegate
        {
            if (System.IO.IsolatedStorage.IsolatedStorageSettings.ApplicationSettings.Contains("Login_Credentials"))
            {
                RootFrame.Navigate(new Uri("/B.xaml", UriKind.Relative));
            }
            else
            {
                RootFrame.Navigate(new Uri("/A.xaml", UriKind.Relative));
            }
        });
    }

然后创建2个虚拟页面A.xamlB.xaml,这样对于A.xaml,您有一些用于保存登录凭据的逻辑(在这种情况下只是一个布尔标志):

A.XAML:

<Grid x:Name="LayoutRoot" Background="Transparent">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <!--TitlePanel contains the name of the application and page title-->
    <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
        <TextBlock x:Name="ApplicationTitle" Text="MY APPLICATION" Style="{StaticResource PhoneTextNormalStyle}"/>
        <TextBlock x:Name="PageTitle" Text="A Page" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
    </StackPanel>

    <!--ContentPanel - place additional content here-->
    <StackPanel x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <Button Content="Save Login Creds" Click="SaveLoginCreds"/>
    </StackPanel>
</Grid>

A.XAML.cs:

private void SaveLoginCreds(object sender, RoutedEventArgs e)
{
    System.IO.IsolatedStorage.IsolatedStorageSettings.ApplicationSettings.Add("Login_Credentials", true);
}

现在,当您第一次运行该应用程序时,它将加载A.xaml,因为它找不到任何登录凭据。然后,如果单击该按钮,它将在IsolatedStorage中保存登录凭据数据。下次启动应用程序,它将加载B.xaml,因为它检测到登录凭据。

我希望这会有所帮助。