2010-09-23 79 views
2

我無法在某些情況下觸發ApplicationBarIconButton的Click事件。PhotoChooserTask未觸發ApplicationBar圖標按鈕單擊事件

我試圖簡化再現它所需的步驟:))

1創建一個新的Windows Phone應用程序

2)添加新的頁面(的Page1.xaml)

3添加上MainPage.xaml中簡單的按鈕啓動一個PhotoChooserTask並導航到的Page1.xaml上Completed事件

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.xam的部分應用程序任務升,其中一個按鈕的點擊事件設置爲一個新的事件處理程序

<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!"); 
    } 

啓動它

單擊按鈕,選擇照片=>您將被重定向到的Page1.xaml

點擊ApplicationBarIconButton按鈕:事件沒有被觸發!

我錯過了什麼或那是一個錯誤?

回答

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;

馬特的變通辦法太多,但我更喜歡使用NavigatedEventHandler比調度.BeginInvoke解決方案。

0

我相信它與選擇器和appbar的混合有關。 ApplicationBar不是一個Silverlight控件,因爲在使用onombstoning之後可能會有一個接線問題。你在設備上試過了嗎?他們之間有一些區別。

+0

是的,我試着用我的LG開發者設備運行RTM固件,它的行爲完全一樣。 – 2010-09-23 21:22:03

+0

這真的很關心!我已經在你的示例中嘗試了兩種形式的菜單按鈕和菜單項上的單擊事件,並且在選擇器返回後它們都不會觸發。實驗更多。 – 2010-09-23 22:27:04

+2

Im 90%肯定它是一個錯誤。請將其發佈在開發人員論壇上或與團隊聯繫。 – 2010-09-23 22:32:27

3

經過一番挖掘,這是由於在完成的事件中的一些奇怪的行爲。

作爲解決方法,您可以強制完成的事件中的導航在UI線程上運行,並且一切正常。

void OnCameraCaptureTaskCompleted(object sender, PhotoResult args) 
    { 
     Dispatcher.BeginInvoke(() => 
       this.NavigationService.Navigate(new Uri("/Page1.xaml", UriKind.Relative))); 
    } 

在完成的事件中還可以做其他限制。這是重要的要注意!

有可能(有希望)是這種行爲的一個很好的理由,但它可以做更好的記錄。

+0

感謝您的解決方法,它完美地工作。它肯定可以有更多的文件。我將在開發論壇上發佈它。 – 2010-09-24 09:43:13

0

有趣的怪癖。

回調發生在UI線程上。使用分派器將導航推遲到UI線程完成其當前活動之後。 它看起來像一些組件在實例化第二頁之前未正確初始化。這是一個錯誤。

+0

我在Windows Phone 8.1中遇到此問題。有什麼建議麼? – 2014-08-22 21:39:53