如您所见,我想导航到“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);
答案 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类的工作原理,这个漂亮的小图解释了很多: