【问题标题】:NullreferenceException when using NavigationService使用 NavigationService 时出现 NullreferenceException
【发布时间】:2012-09-15 01:03:46
【问题描述】:

我的 WP7 应用遇到问题:

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

我的代码是这样的,它在构造函数中:

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

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

有人有什么建议吗?

谢谢。

【问题讨论】:

  • 请向我们展示 CheckLogin 的实现,以便我们看看有什么问题。

标签: c# windows-phone-7 navigationservice


【解决方案1】:

这就是我认为你想要做的 (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,因为它检测到登录凭据。

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多