在PhotoChooserTask之后未触发的ApplicationBar图标按钮单击事件

时间:2010-09-23 20:29:56

标签: c# windows-phone-7

我无法在某些条件下触发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按钮:事件未被触发!

我错过了什么或者那是一个错误吗?

4 个答案:

答案 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推迟导航。 看起来某些组件在第二页实例化之前未正确初始化。这是一个错误。