问题
在Windows 8.1上,在用户离开应用程序和OnSuspended事件触发之间到底发生了什么?我在这个范围内管理对象的能力有问题,特别是MediaCpture对象。
为了更好地解释这个问题,下面是一个场景:
有了ObscuredEvent,就没有OnNavigatingFrom了,除非您要在同一帧中找到另一个页面,否则OnNavigatingFrom不会触发。经过一些调查,我发现唯一的火灾事件是Window.Current.VisibilityChanged
当页面是OnNavigatedFrom中的NavigatedTo并解钩(参见下面的ex2 )时,我一直在继续并挂起它。在事件内部,我检查参数,该参数指示应用程序是否隐藏或显示,并相应地释放/初始化(参见下面的ex.1 )。
问题
但是,此仅适用于附加的调试器。如果在没有附加调试器的情况下这样做,它不会重新初始化,而且经常会使相机崩溃,我必须重新启动设备。
代码示例1(注意: e.Visible == false离开应用程序,返回时为true )
async void Current_VisibilityChanged(object sender, VisibilityChangedEventArgs e)
{
if (!e.Visible) //means leaving the app
{
await DisposeAll(); //cleans the MediaCapture and CaptureElement
}
else
{
if(mediaCaptureManager != null) await DisposeAll();
await Initialization(); //set up camera again
}
}示例2(链接到事件)
protected override void OnNavigatedTo(NavigationEventArgs e)
{
Window.Current.VisibilityChanged += Current_VisibilityChanged;
this.navigationHelper.OnNavigatedTo(e);
}
protected async override void OnNavigatedFrom(NavigationEventArgs e)
{
Window.Current.VisibilityChanged -= Current_VisibilityChanged;
this.navigationHelper.OnNavigatedFrom(e);
}更新:解决方案
与其使用VisibilityChanged,不如在页面的构造函数上挂钩到Window.Current.Activated。在调试器完全分离之后,激活的事件将在WindowActivationState中提供WindowActivatedEventArgs参数。如下所示:
private async void CurrentOnActivated(object sender, WindowActivatedEventArgs e)
{
if(e.WindowActivationState == CoreWindowActivationState.Deactivated)
{
//dispose MediaCapture here
}
else if(e.WindowActivationState == CoreWindowActivationState.CodeActivated || e.WindowActivationState == CoreWindowActivationState.PointerActivated)
{
//initialize MediaCapture here
}
}发布于 2015-01-24 10:12:11
我不确定使用暂停/恢复事件是否更合适。请注意,在本例中,您必须正确地调试它- it behaves little different while being run with/without debugger attached。
至于代码--在OnNavigatedTo/OnNavigatedFrom中链接您的事件不是一个好主意--当操作系统挂起应用程序并使用SuspensionManager时,OnNavigatedFrom将被调用,但是当您回到应用程序(恢复)时,OnNavigatedTo将不会被调用。
在这里,使用窗口事件也可能有效,但是为什么不在构造函数中订阅一次呢?-它是窗口范围的,因此在电话中只有一个窗口,它代表应用程序,然后订阅一次。在这种情况下,您可以在窗口中添加一条识别当前页的行,如果该页包含中介,则释放(创建类似的)。然后,您还可以在导航事件中配置/初始化,以防用户不离开应用程序,只需导航。
发布于 2015-02-18 20:26:16
请看我在https://stackoverflow.com/a/28592882/3998132上的答案。我相信,将Window.VisibilityChanged与页面\UserControl加载\卸载处理程序结合使用,可以解决您的问题。
使用Window.Activated不如使用Window.VisibilityChanged,因为激活涉及到可见性和焦点,因为VisibilityChanged只与可见性有关。对于显示具有焦点的预览是不适用的。由于Windows上的Windows应用程序只能有一个窗口显示,但是,如果您的应用程序变得通用并运行在Windows 8+现代外壳(它可以显示多个商店应用程序并具有快速窗口功能)或Windows 10桌面(它可以支持同时显示多个商店应用程序),那么当用户更改应用焦点时,您将不想停止预览,但您的应用程序仍在显示。
https://stackoverflow.com/questions/28113120
复制相似问题