代码之家  ›  专栏  ›  技术社区  ›  Olivier Payen Sackurise

PhotoChooserTask后未激发ApplicationBar图标按钮单击事件

  •  2
  • Olivier Payen Sackurise  · 技术社区  · 15 年前

    在某些情况下,我无法启动ApplicationBarIconButton的click事件。

    我试图简化复制它所需的步骤:

    1) 创建新的Windows Phone应用程序

    2) 添加新页面(Page1.xaml)

    3) 添加一个简单的按钮主页.xaml启动PhotoChooserTask并导航到已完成事件的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!");
        }
    

    单击按钮选择图片=>您将被重定向到Page1.xaml

    单击ApplicationBarIconButton:事件未触发!

    我错过什么了还是那是个错误?

    4 回复  |  直到 15 年前
        1
  •  3
  •   Matt Lacey    15 年前

    作为一种解决方法,您可以强制在UI线程上运行completed事件中的导航,一切正常。

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

    在完成的事件中也有其他限制。这一点需要注意!

        2
  •  1
  •   Olivier Payen Sackurise    14 年前

    在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而不是NavigatedEventHandler调度器.BeginInvoke解决方案。

        3
  •  0
  •   Lukasz Madon    15 年前

    我相信这与chooser和appbar的混合有关。 ApplicationBar不是Silverlight控件,因为在toombstoning之后连接它可能有一个bug。你在设备上试过吗?他们之间有些不同。

        4
  •  0
  •   bkaid    14 年前

    有趣的怪癖。

    在实例化第二个页面之前,某些组件似乎没有正确初始化。这是个虫子。

    推荐文章