处理MediaCapture的Resume事件 - 与File Picker示例结合使用时的CaptureElement

时间:2014-09-09 23:19:23

标签: c# xaml windows-phone-8.1 win-universal-app fast-app-switching

这适用于从File Picker示例创建的Windows Universal App。该示例的基本代码包括Windows Phone项目中的ContinuationManager类和OnActivated文件中的App.xaml.cs方法,以及常见的NavigationHelper类。

我在解决方案中也使用MediaCaptureCaptureElement,但我未能正确处理Resuming事件。这就是我的工作:

我使用NavigationHelper_LoadStateNavigationHelper_SaveState方法来启动和停止相机预览(这是LiveCamera.xaml.cs文件的一部分)。

private async void NavigationHelper_LoadState(object sender, LoadStateEventArgs e)
{
    // Start the camera preview
    await StartCameraPreview();
}

private async void NavigationHelper_SaveState(object sender, SaveStateEventArgs e)
{
    // Stop the camera preview
    await StopCameraPreview();
}

在应用程序内的页面之间导航时效果很好,但在暂停/恢复事件时不会停止/重启摄像机。

我通过添加App.xaml.cs以下方法来处理Resuming事件(SuspensionManager负责在恢复应用时调用NavigationHelper_LoadState方法)来修复此问题:

async void App_Resuming(object sender, object e)
{
    await SuspensionManager.RestoreAsync();
}

上面的代码在附加Visual Studio(在调试和释放模式下)执行时效果很好:当接收Suspend / Resume事件并且File Picker正确返回文件时,摄像头预览会停止/重新启动。

但是,如果我在没有Visual Studio的情况下执行应用程序(只是从应用程序列表中启动应用程序),相机预览仍会在接收暂停/恢复事件时停止/重新启动,但在选择带有文件选择器的文件时,我看到"恢复..."进度条,然后应用程序只是崩溃。

选择文件后,App_ResumingOnActivated方法会以某种方式发生冲突。我通过在输入每个方法时显示MessageDialog来验证这一点(因为我无法使用Visual Studio重新编写问题):在我选择图片后,我在应用程序崩溃之前暂时看到App_Resuming消息(从不看看OnActivated消息)。我不希望在文件选择器之后调用该方法,因为在执行带有VS的应用程序时,该方法不会被调用。

为什么在没有附加VS时会调用不同的(以及我理解的,不正确的)方法?

1 个答案:

答案 0 :(得分:0)

问题的存在是因为您在Page的构造函数中运行 FileOpenPicker 。这没什么好处的。为了测试,我在LoadPhoto页面中提供了一个按钮:

在XAML中:

<Grid>
    <Button Name="myButton" Content="Click me"/>
    <Image x:Name="Image" Stretch="Uniform"/>
</Grid>

在构造函数中:

public LoadPhoto()
{
    this.InitializeComponent();
    this.navigationHelper = new NavigationHelper(this);
    myButton.Click += (sender, e) => LaunchPicker();
}

您可以使用download here

代码

也许你可以先选择一个文件,然后导航到一个页面。