Почему NavigationService.Navigate работает только в конце? - PullRequest
1 голос
/ 23 ноября 2011

Как видите, я хочу перейти на страницу "ScoreInputDialog.xaml", где пользователь может ввести имя.После этого я пытаюсь сохранить имя в списке, но оно всегда пустое, потому что переход к странице «ScoreInputDialog.xaml» наконец-то выполняется.Как я могу перейти на нужную страницу и получить свое значение, прежде чем продолжить с остальным кодом?

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

Ответы [ 3 ]

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

Вы ничего не должны делать непосредственно после вызова Navigate.Вместо этого переопределите метод OnNavigatedTo страницы, с которой вы заходите, чтобы получать уведомления, когда пользователь возвращается :

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

Этот метод будет вызываться при выходе пользователя из "ScoreInputDialog.xaml ", вероятно, нажав кнопку назад или потому что вы звоните NavigationService.GoBack().Это выходит из страницы «ScoreInputDialog.xaml» и переходит на предыдущую страницу, где будет вызываться OnNavigatedTo.Это время, чтобы проверить значение.

Иллюстрация потока навигации:

«OriginPage» --- [Navigate] ---> «ScoreInputDialog» --- [GoBack() или кнопка «Назад»] --> «OriginPage» (*)

Там, где (*), будет вызываться OnNavigatedTo.Реализация может выглядеть следующим образом:

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

Не забудьте очистить имя временного игрока перед вызовом Navigate:

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

Примечание: OnNavigatedTo также будет вызываться, когда пользовательвидит страницу в первый раз или переходит с других страниц, кроме "ScoreInputDialog.xaml".Но тогда значение "tmpPlayerName" не будет установлено.

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

Navigate выполняется не в последнюю очередь, а просто асинхронно. Вам нужно дождаться завершения навигации.

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

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

Прочитайте следующую страницу: http://msdn.microsoft.com/en-us/library/ms615507.aspx

Внизу после определений «Методы и свойства» в части «Примечание» объясняется, как работает класс NavigationService, и этот симпатичный маленький рисунок объясняет многое:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...