В Windows Phone 7 служба навигации привязана к странице. Как вызвать с внешней страницы?

Мое приложение собирает имя пользователя и пароль из mainpage.xaml и отправляет http-запрос на сервер. Если ответ от сервера PASS, я хочу, чтобы элемент управления был перемещен на другую страницу xaml. Я использовал следующий код

       if ((rs1[0].Trim()).Equals("PASS"))
       {
          NavigationService.Navigate(new Uri("/SecondPage.xaml", UriKind.Relative));
                     }
       else
       {
           MessageBox.Show(rs);
       }

где rs1 — массив строк.

Но я получаю исключение NullReferenceException. Пожалуйста, предложите любой альтернативный способ. Заранее спасибо.

Полный код выглядит следующим образом:

namespace aquila1
{
    public partial class MainPage : PhoneApplicationPage
    {
        static string username;
        static string password;
        static string rs;

        static NavigationService ns = new NavigationService();

        // Constructor
        public MainPage()
        {
            InitializeComponent();


        }

        private static ManualResetEvent allDone = new ManualResetEvent(true);

       private void HyperlinkButton_Click_1(object sender, RoutedEventArgs e)
       {
           username = textbox1.Text;
           password = textbox2.Text;
           System.Diagnostics.Debug.WriteLine(username);
           System.Diagnostics.Debug.WriteLine(password);

           HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://60.243.245.181/fms_tracking/php/mobile_login.php?username=" + username + "&password=" + password);


           request.ContentType = "application/x-www-form-urlencoded";

           // Set the Method property to 'POST' to post data to the URI.
           request.Method = "POST";

           // start the asynchronous operation
           request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request);

           // Keep the main thread from continuing while the asynchronous 
           // operation completes. A real world application 
           // could do something useful such as updating its user interface. 
           allDone.WaitOne();



       }


        private static void GetRequestStreamCallback(IAsyncResult asynchronousResult)
        {

            HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

            // End the operation
            Stream postStream = request.EndGetRequestStream(asynchronousResult);

            // Console.WriteLine("Please enter the input data to be posted:");
            string postData = username + "+" + password;
            System.Diagnostics.Debug.WriteLine(postData);
            // Convert the string into a byte array. 
            byte[] byteArray = Encoding.UTF8.GetBytes(postData);

            // Write to the request stream.
            postStream.Write(byteArray, 0, postData.Length);
            postStream.Close();

            // Start the asynchronous operation to get the response
            request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
        }

        private static void GetResponseCallback(IAsyncResult asynchronousResult)
        {
            HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

            // End the operation
            HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);
            Stream streamResponse = response.GetResponseStream();
            StreamReader streamRead = new StreamReader(streamResponse);
           string responseString = streamRead.ReadToEnd();
            rs = responseString; 
            System.Diagnostics.Debug.WriteLine(responseString);
            System.Diagnostics.Debug.WriteLine("@@@@@");
            System.Diagnostics.Debug.WriteLine(rs);

            // Close the stream object
            streamResponse.Close();
            streamRead.Close();

            // Release the HttpWebResponse
            response.Close();
            move2();


            allDone.Set();

        }


       private static void move2()
       {

           string[] rs1 = rs.Split(':');
           if ((rs1[0].Trim()).Equals("PASS"))
           {

               ns.Navigate(new Uri("/SecondPage.xaml", UriKind.Relative));
           }
           else
           {
               MessageBox.Show(rs);
           }
       }



    }
}

person user2090226    schedule 16.04.2013    source источник
comment
Какой объект null?   -  person Rowland Shaw    schedule 16.04.2013
comment
@RowlandShaw: объект не является нулевым, но когда элемент управления переходит к следующей строке, возникает NullReferenceException NavigationService.Navigate(new Uri(/SecondPage.xaml, UriKind.Relative));   -  person user2090226    schedule 16.04.2013
comment
@RowlandShaw: я также проверил содержимое как rs, так и rs1[0]. Они по желанию.   -  person user2090226    schedule 16.04.2013
comment
Где вы написали этот код? ViewModel?   -  person ken2k    schedule 16.04.2013
comment
@ken2k : Нет, я написал в MainPage.xaml.cs   -  person user2090226    schedule 16.04.2013
comment
Объект должен иметь значение null, чтобы получить NullReferenceException. Я предлагаю проверить в отладчике, что для вас является значением null.   -  person Rowland Shaw    schedule 16.04.2013
comment
Фрагмент, который вы показали, хорош. Но покажите нам еще немного кода. Дайте трассировку стека. В противном случае мы не можем ничего сказать.   -  person Mani    schedule 16.04.2013
comment
@max: я добавил свой код в вопрос.   -  person user2090226    schedule 17.04.2013
comment
stackoverflow.com/questions/3730245/   -  person Waleed    schedule 02.08.2013


Ответы (3)


Я почти уверен, что вы не можете инициализировать new NaviagtionService(), вы можете получить экземпляр только из свойства PageInstance.NavigationService в Silverlight.

(См. http://msdn.microsoft.com/en-us/library/system.windows.navigation.navigationservice(v=vs.95).aspx)

Вы можете получить текущую страницу, используя (Application.Current.RootVisual as Frame).Content as PhoneApplicationPage, поэтому вы можете получить на ней PageInstance.NavigationService.

Но проще вызвать Navigate() на Frame напрямую, (Application.Current.RootVisual as Frame).Navigate(...) просто будет работать.

person yume_chan    schedule 28.08.2014

Мои экстрасенсорные способности к отладке говорят мне, что вы написали код внутри либо: - статического конструктора - конструктора - метода, вызываемого перед вызовом OnNavigatedTo

Как правило, NavigationService равно null до того, как вы введете метод OnNavigatedTo. Возможно, вы захотите переместить эту логику из ее текущей позиции.

Где он вообще сейчас находится?

person Toni Petrina    schedule 16.04.2013

@user2090226 user2090226 У вас есть файл SecondPage.xaml в корне? Просто спрашиваю вас, потому что люди делают глупые ошибки. В противном случае попробуйте использовать uri, чтобы указать полный путь. И желательно проверить навигацию. Вы создали объект вместо фабричных методов. Бывший:

new Uri("/MyProject;component/AllPageFolder/SecondPage.xaml",Urikind.Relative);

Для страниц, созданных в самом корне, возьмите этот пример:

NavigationService.Navigate(new Uri("/Photography;component/SlideShow.xaml", UriKind.Relative));
person Mani    schedule 17.04.2013