6

这是在 Windows Phone 8.1 Store 应用程序中。我MainPage有一个显示来自我的对象CaptureElement的预览流。MediaCapture对于应用程序内的导航(页面之间),这很好用:

MediaCapture mc;

protected override async void OnNavigatedTo(NavigationEventArgs e)
{
   mc = new MediaCapture();
   await mc.InitializeAsync();
   preview.Source = mc;
   await mc.StartPreviewAsync();
}

protected override async void OnNavigatedFrom(NavigationEventArgs e)
{
   await mc.StopPreviewAsync();
}

我可以导航到其他页面并返回,并且预览运行可靠。我在以下情况下遇到了问题:

  • 用户按下 Windows 按钮,然后按下后退按钮
  • 用户按下 Windows 按钮,然后使用任务切换器返回到我的应用程序
  • 用户按下搜索按钮,然后按下返回按钮
  • 用户按下电源按钮,然后再次按下并向上滑动以解锁设备
  • 用户按住返回按钮进入任务切换器,然后再次点击我的应用程序

在上述每个操作(和/或它们的组合)之后,当我的应用程序返回时,预览会冻结在显示的最后一帧。

如果用户然后导航到不同的页面,然后返回到 MainPage,预览将再次开始运行而没有问题,所以这让我相信我只需要在从上述场景之一返回后停止/启动预览。

我尝试订阅App.SuspendingandApp.Resuming事件,但这些不会在这些场合触发。我错过了什么?

4

2 回答 2

4

您将不得不使用App.SuspendingApp.Resuming(对于您描述的情况)与导航事件的组合(在页面之间导航时)。OnNavigatingFrom当您点击Start、按住Back或使用Search(当应用程序暂停时)时调用该事件,但是当您恢复应用程序时,不会OnNavigatedTo调用事件 - 仅在您导航时调用此事件。所以在你的情况下,当你点击时Start,预览会停止,当你回来时它不会再次开始。对 MSDN 的参考

注意在 Windows Phone 上,应用程序暂停时调用 OnNavigatedFrom()。应用程序恢复时不会调用 OnNavigatedTo()。

另一件事是,要正确调试应用程序,您必须在 Visual Studio 中使用“调试位置”选项卡的生命周期事件- 当您调试应用程序时,它不会被暂停,但是当您正常运行应用程序时,它会被暂停你打之后。Start

另请注意,应用程序可以进入未运行状态。更多关于MSDN 生命周期的信息。

于 2014-05-31T18:15:37.360 回答
1

您描述的场景应该触发Window.Current.VisibilityChanged事件,您可以在其中使用VisibilityChangedEventArgs.Visible传递到事件处理程序以在不可见时清理预览并在可见时初始化预览。Window.Current.VisibilityChanged您可以在您的 Page\UserControl 的 Loaded\Unloaded 处理程序中订阅\取消订阅事件。

暂停/恢复生命周期事件不够充分的原因是您上面提到的场景并不能确定性地在某个时间调用这些事件,因为操作系统只会暂停基于内部策略的应用程序,该内部策略可能会随着操作系统发布更新而改变。

另外顺便说一句,我会避免使用 Navigation 处理程序,而是依赖 Loaded\Unloaded 处理程序,如果您不得不将 CaptureElement 移动到自己的 UserControl 中而不是 Page 中并避免这种情况,这将允许初始化\清理正常发生其中 WP 将调用 OnNavigatedFrom 而不会调用 OnNavigatedTo 以进行暂停\恢复(Loaded\Unloaded 将始终按顺序调用)。

于 2015-02-18T20:05:16.470 回答