我的App.xaml中有一个全局应用栏。其中一个按钮调用PhoneNumberChooserTask -
private void AppBarContacts_Click(object sender, EventArgs e)
{
PhoneNumberChooserTask chooserTask = new PhoneNumberChooserTask();
chooserTask.Completed += new EventHandler<PhoneNumberResult>(chooserTask_Completed);
chooserTask.Show();
}
并将结果传递给
void chooserTask_Completed(object sender, PhoneNumberResult e)
{
string phoneNumber = "";
if ((TaskResult.Cancel != e.TaskResult) && (TaskResult.None == e.TaskResult))
{
phoneNumber = e.PhoneNumber;
}
PhoneApplicationFrame root = (PhoneApplicationFrame)Application.Current.RootVisual;
root.Navigate(new Uri("/MainPage.xaml?number=" + phoneNumber, UriKind.Relative));
}
在导航之后,ApplicationBarIconButton的click事件不再触发。 This表明这是一个已知问题,但他们的工作建议我无法使用,因为我无法从App.xaml.cs访问NavigationService。
我可以通过设置一个除了启动任务之外什么也不做的页面来解决这个问题(我尝试添加一个像“/MainPage.xaml?getnumber=1”这样的标志并在那里进行,但是当选择器返回时会再次调用它,所以它只是永远循环)但这意味着你在选择器启动之前得到一个空白页面,这看起来不太好。
有更好的解决方案吗?
答案 0 :(得分:1)
问题出在NavigationService.Navigated
事件订阅中,即在PhoToChooserTask.Completed
之前引发OnNavigatedTo
事件,因此,如果您从中调用root.Navigate
,则会出现这种奇怪的行为。
解决方法是在第一帧绘图中调用root.Navigate
(在OnNavigatedTo
之后等等)。 Deployment.Current.Dispatcher.BeginInvoke
可用于此,因此完整代码为:
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
root.Navigate(new Uri("/MainPage.xaml?number=" + strNumber, UriKind.Relative));
});