1

所以我试图在 WP7 中做一件非常简单的事情,比如:

MainPage中的一个按钮将启动相机,当相机成功拍照时,我想将图片传递给SecondPage并启动它。

这是我的代码:

在 MainPage 构造函数中,我初始化相机任务并设置委托:

camTask.Completed += new EventHandler<PhotoResult>(camTask_Completed);

然后我实施了camTask_Completed

 void camTask_Completed(object sender, PhotoResult e)
    {
        //throw new NotImplementedException();
        
        img = PictureDecoder.DecodeJpeg(e.ChosenPhoto);
        NavigationService.Navigate(new Uri("/SecondPage.xaml", UriKind.Relative));
    }

该应用程序将在我拍照后按“接受”之前正常运行。

异常说:

Exception {"Navigation is not allowed when the task is not in the foreground."} System.Exception {System.InvalidOperationException}

我的理解是我不应该在方法中启动 SecondPage camTask_Completed

那么我的问题是:如何在 EventHandler 的结果上启动另一个页面?

谢谢

更新:(有关此子问题的答案,请参阅此页面中的此评论

单击按钮后我发现另一个错误(启动相机):

它抛出一个异常说:

"Type 'System.Windows.Media.Transform' cannot be serialized. Consider marking it with the DataContractAttribute attribute, and marking all of its members you want serialized with the DataMemberAttribute attribute."

我在哪里可以序列化这些Transform东西?

我在谷歌上做了一些搜索,发现了这个

找到了答案,错误实际上也暗示了它:)

[数据合约]

[KnownType(typeof(System.Windows.Media.MatrixTransform))]

似乎它可以解决这个问题,但我应该把这些线放在哪里?

这是我在 MainPage 上将图像传递给 SecondPage 的代码,imgWriteableBitmap

 protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
    {
        base.OnNavigatedFrom(e);
        var brush = new ImageBrush();
        brush.ImageSource = img;
        PhoneApplicationService.Current.State["bkg"] = brush;
    }

再次感谢。

4

2 回答 2

1

也许您应该尝试使用调度程序:

activePage.Dispatcher.BeginInvoke(
     () => NavigationService.Navigate(new Uri("/SecondPage.xaml", UriKind.Relative)));

这适用于 MetroApps。

于 2012-10-17T13:36:38.547 回答
0

这是 CameraCaptureTask 的一个已知问题。
这是我使用的解决方法:

    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);
    }
于 2012-10-17T13:50:55.603 回答