为什么NavigationService.Navigate只在最后运行?

时间:2011-11-22 21:52:31

标签: c# silverlight windows-phone-7

如您所见,我想导航到“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 个答案:

答案 0 :(得分:2)

最后没有执行

Navigate,它只是异步发生。您必须等待导航完成。

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

答案 1 :(得分:2)

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

注意:当用户第一次看到页面或从“ScoreInputDialog.xaml”以外的其他页面导航回来时,也会调用OnNavigatedTo。但是不会设置“tmpPlayerName”值。

答案 2 :(得分:0)

阅读以下页面:http://msdn.microsoft.com/en-us/library/ms615507.aspx

在“备注”部分的“方法和属性”定义之后的底部,它解释了NavigationService类的工作原理,这个漂亮的小图解释了很多:

enter image description here