我无法在某些条件下触发ApplicationBarIconButton的click事件。
我试图简化重现它所需的步骤:
1)创建一个新的Windows Phone应用程序
2)添加新页面(Page1.xaml)
3)在MainPage.xaml上添加一个简单的按钮,启动PhotoChooserTask并在Completed事件上导航到Page1.xaml
public partial class MainPage : PhoneApplicationPage
{
PhotoChooserTask photo;
public MainPage()
{
InitializeComponent();
photo = new PhotoChooserTask();
photo.Completed += OnCameraCaptureTaskCompleted;
}
void OnCameraCaptureTaskCompleted(object sender, PhotoResult args)
{
this.NavigationService.Navigate(new Uri("/Page1.xaml", UriKind.Relative));
}
private void button1_Click(object sender, RoutedEventArgs e)
{
photo.Show();
}
}
6)取消注释Page1.xaml的ApplicationBar部分,并将其中一个按钮的click事件设置为新的事件处理程序
<phone:PhoneApplicationPage.ApplicationBar>
<shell:ApplicationBar IsVisible="True">
<shell:ApplicationBarIconButton IconUri="/Images/appbar_button1.png" Text="Won't work" Click="ApplicationBarIconButton_Click" />
</shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>
private void ApplicationBarIconButton_Click(object sender, EventArgs e)
{
MessageBox.Show("This messagebox won't show!");
}
启动它
点击按钮选择图片=&gt;您被重定向到Page1.xaml
单击ApplicationBarIconButton按钮:事件未被触发!
我错过了什么或者那是一个错误吗?
答案 0 :(得分:3)
经过一番挖掘后,这是由于完成的事件中出现了一些奇怪的行为。
作为一种解决方法,您可以强制已完成事件中的导航在UI线程上运行,一切正常。
void OnCameraCaptureTaskCompleted(object sender, PhotoResult args)
{
Dispatcher.BeginInvoke(() =>
this.NavigationService.Navigate(new Uri("/Page1.xaml", UriKind.Relative)));
}
您还可以在已完成的活动中执行其他操作。重要的是要注意!
可能(希望是)这种行为的一个很好的理由,但它可以更好地记录。
答案 1 :(得分:1)
在WP7官方论坛上发布该问题后(here是该问题的链接),我得到了回复,告知这是一个已知问题。
这似乎是“官方”解决方法:
void OnCameraCaptureTaskCompleted(object sender, PhotoResult args)
{
//Delay navigation until the first navigated event
NavigationService.Navigated += new NavigatedEventHandler(navigateCompleted);
}
void navigateCompleted(object sender, EventArgs e)
{
//Do the delayed navigation from the main page
this.NavigationService.Navigate(new Uri("/Page1.xaml", UriKind.Relative));
NavigationService.Navigated -= new NavigatedEventHandler(navigateCompleted);
}
(您需要添加using System.Windows.Navigation;
)
Matt的解决方法也有效,但我更喜欢使用NavigatedEventHandler而不是Dispatcher.BeginInvoke解决方案。
答案 2 :(得分:0)
我相信它与选择器和appbar混合有关。 ApplicationBar不是Silverlight控件,因为在toombstoning之后可能有一个错误。你在设备上试过了吗?它们之间存在一些差异。
答案 3 :(得分:0)
有趣的怪癖。
回调发生在UI线程上。在UI线程完成当前活动之后,使用Dispatcher推迟导航。 看起来某些组件在第二页实例化之前未正确初始化。这是一个错误。