mediaccapture + CaptureElement生命周期/导航管理
本文关键字:导航 管理 周期 生命 CaptureElement mediaccapture | 更新日期: 2023-09-27 18:05:58
这是一个Windows Phone 8.1商店应用程序。我的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按钮,然后使用任务切换器返回到我的应用程序
- 用户先按搜索键,再按返回键
- 用户按下电源键,然后再次按下电源键并向上滑动解锁设备
- 用户按住后退键进入任务切换器,然后再次点击我的应用
在以上每个动作(和/或它们的组合)之后,当我的应用程序返回时,预览被冻结在显示的最后一帧。
如果用户随后导航到不同的页面,然后返回到主页面,则预览再次开始运行而没有任何问题,因此这使我相信我只需要在从上述场景之一返回后停止/启动预览。
我尝试订阅App.Suspending
和App.Resuming
事件,但是这些事件在这些情况下不会触发。我错过了什么?
您将不得不使用App.Suspending
和App.Resuming
(对于您所描述的情况)与导航事件的组合(在页面之间导航时)。当您点击开始,按住返回或使用搜索时(当应用程序处于挂起状态时),OnNavigatingFrom
事件被调用,但当您恢复应用程序时,OnNavigatedTo
是而不是被调用-此事件仅在您导航时被调用。在你的例子中,当你点击开始时,预览停止,当你回来时它不会再次开始。对MSDN的引用:
注意在Windows Phone上,OnNavigatedFrom()在应用程序暂停时被调用。OnNavigatedTo()在应用程序恢复时不会被调用。
另一件事是,要正确调试应用程序,你必须使用Lifecycle Events debug Location选项卡在Visual Studio中-当你调试应用程序时,它不会被挂起,但是当你正常运行应用程序时,它会在你点击Start后被挂起。
还请注意,应用程序可以设置为未运行状态。
您描述的场景应该触发Window.Current.VisibilityChanged
事件,您可以使用传递给事件处理程序的VisibilityChangedEventArgs.Visible
在不可见时清除预览,并在可见时初始化预览。您可以订阅/取消订阅Window.Current.VisibilityChanged
事件在您的加载'卸载处理程序为您的页面'UserControl。
挂起/恢复生命周期事件是不够的,因为你上面提到的场景不能确定地在某个时间调用这些事件,因为操作系统只会根据内部策略挂起一个应用程序,这个策略可以随着操作系统版本的更新而改变。
也作为一个旁白,我会避免使用导航处理程序,而是依赖于加载'卸载处理程序,这将允许初始化'清理正确发生,如果你曾经不得不移动你的CaptureElement到自己的UserControl,而不是在一个页面,并避免场景WP将调用OnNavigatedFrom,而不是调用OnNavigatedTo暂停'resume(加载'卸载将始终按顺序调用)。