Mudasar
Mudasar

Reputation: 33

Why is NavigationService.Navigate running at the end only?

As you can see, I want to navigate to "ScoreInputDialog.xaml" page, where the user can type in a name. After this I am trying to save the name to a list, but it is always empty because navigation to page "ScoreInputDialog.xaml" is being done at last. How can I navigate to the desired page and get my value before continuing with rest of the code?

NavigationService.Navigate(new Uri("/ScoreInputDialog.xaml", UriKind.Relative)); // Sets tempPlayerName through a textbox.
if (phoneAppService.State.ContainsKey("tmpPlayerName"))
{
    object pName;
    if (phoneAppService.State.TryGetValue("tmpPlayerName", out pName))
    {
        tempPlayerName = (string)pName;
    }
}
highScorePlayerList.Add(tempPlayerName);

Upvotes: 1

Views: 712

Answers (3)

danbord
danbord

Reputation: 4076

Read the following page : http://msdn.microsoft.com/en-us/library/ms615507.aspx

At the bottom after the Methods and Properties definitions in the "Remark" part it explains how the NavigationService Class works and this nice little graphic explains a lot :

enter image description here

Upvotes: 0

Heinrich Ulbricht
Heinrich Ulbricht

Reputation: 10372

You should do nothing directly after the Navigate call. Instead override the OnNavigatedTo method of the page you are coming from, to get notified when the user comes back:

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)

This method will be called when the user exits the "ScoreInputDialog.xaml", probably by pressing the back button or because you call NavigationService.GoBack(). This exits the "ScoreInputDialog.xaml" page and goes to the previous page, where the OnNavigatedTo will be called. This is the time to check for the value.

Illustration of the navigation flow:

"OriginPage" ---[Navigate]---> "ScoreInputDialog" ---[GoBack() or Back-button]---> "OriginPage" (*)

Where the (*) is there the OnNavigatedTo will be called. The implementation could look like this:

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
    if (phoneAppService.State.ContainsKey("tmpPlayerName"))
    {
        object pName;
        if (phoneAppService.State.TryGetValue("tmpPlayerName", out pName))
        {
            tempPlayerName = (string)pName;
        }
        highScorePlayerList.Add(tempPlayerName);
    }
}

Remember to clear the temp player name before calling Navigate:

phoneAppService.State.Remove("tmpPlayerName");
NavigationService.Navigate(new Uri("/ScoreInputDialog.xaml", UriKind.Relative));

Note: OnNavigatedTo will also be called when the user sees the page the first time or navigates back from other pages than "ScoreInputDialog.xaml". But then the "tmpPlayerName" value will not be set.

Upvotes: 2

Mike Park
Mike Park

Reputation: 10931

Navigate isn't being performed last, it is just happening asynchronously. You have to wait for the navigation to complete.

http://msdn.microsoft.com/en-us/library/system.windows.navigation.navigationservice.navigated.aspx

Upvotes: 2

Related Questions