user2090226
user2090226

Reputation: 97

In windows phone 7, navigation service is specific to a page. How do i invoke from an outside page?

My application collects username and password from mainpage.xaml and makes an httprequest to the server. If the response from the server is PASS then i want the control to be navigated to another xaml page. I used the following code

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

where rs1 is an array of strings.

But I get a NullReferenceException. Plz suggest any alternate way. Thanks in advance.

The full code is as follows:

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);
           }
       }



    }
}

Upvotes: 0

Views: 1314

Answers (3)

yume_chan
yume_chan

Reputation: 856

I'm pretty sure you cannot initialize a new NaviagtionService(), you can only get an instance from PageInstance.NavigationService property, in Silverlight.

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

You can get the current page using (Application.Current.RootVisual as Frame).Content as PhoneApplicationPage, so you can get PageInstance.NavigationService on it.

But a simpler way is to call Navigate() on Frame directly, (Application.Current.RootVisual as Frame).Navigate(...) will just be working.

Upvotes: 1

Mani
Mani

Reputation: 1374

@user2090226 Do you have your SecondPage.xaml on the root? Just asking you because people make silly mistakes. Otherwise try using uri to be in full path. And preferably check your navigation. You created an object instead of factory methods. Ex:

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

For Pages created in the root itself take this example:

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

Upvotes: 0

Toni Petrina
Toni Petrina

Reputation: 7122

My psychic debugging abilities tell me that you have wrote the code inside either: - a static constructor - constructor - a method called before calling OnNavigatedTo

In general, NavigationService is null before you enter the OnNavigatedTo method. You might want to move that logic from its current position.

Where is it located now anyway?

Upvotes: 0

Related Questions