Решение NullReferenceException путем перенаправления навигации попало в непрерывный цикл - PullRequest
0 голосов
/ 22 ноября 2011

все

Как и в большинстве приложений, мне нужно добавить страницу входа в мое приложение, если установлен пароль. Ожидаемое поведение приложения заключается в том, что, только если установлен пароль, оно должно перейти к 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");
        }
    }

Есть предложения?

Алфа

Ответы [ 2 ]

2 голосов
/ 22 ноября 2011

Если вы возвращаетесь на страницу позади страницы, на которой вы находитесь, вам следует использовать встроенный метод NavigationService.GoBack(). Это позволяет телефону обрабатывать стопку страниц.

Если вам нужно продвигаться вперед, но никогда не возвращаться на страницу, в Mango вам теперь нужно вручную удалить эту страницу из стека, используя NavigationService.RemoveBackEntry().

Глядя на ваш код, обработчик навигации будет всегда срабатывать. Похоже, вы проверяете, включен ли пароль, а не проверен ли пользователь. Я бы просто сказал, что логика проверки пароля неверна.

0 голосов
/ 23 ноября 2011

Мне удалось решить это так,

Я не знаю, правильный ли это подход. но это работает. Сначала я изменил начальную страницу по умолчанию на несуществующую страницу под названием RootPage.xaml в WMAppManifest.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

...