Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MediaCapture&x2B;CaptureElement生命周期/导航管理_C#_Windows Runtime_Windows Store Apps_Windows Phone 8.1_Win Universal App - Fatal编程技术网

C# MediaCapture&x2B;CaptureElement生命周期/导航管理

C# MediaCapture&x2B;CaptureElement生命周期/导航管理,c#,windows-runtime,windows-store-apps,windows-phone-8.1,win-universal-app,C#,Windows Runtime,Windows Store Apps,Windows Phone 8.1,Win Universal App,这在Windows Phone 8.1应用商店应用程序中。MyMainPage有一个CaptureElement来显示MyMediaCapture对象的预览流。对于应用程序内的导航(页面之间),这很好: MediaCapture mc; protected override async void OnNavigatedTo(NavigationEventArgs e) { mc = new MediaCapture(); await mc.InitializeAsync();

这在Windows Phone 8.1应用商店应用程序中。My
MainPage
有一个
CaptureElement
来显示My
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
(对于您所描述的情况),并结合导航事件(在页面之间导航时)。当您点击Start、hold Back或use Search(当应用程序挂起时)时,会调用
OnNavigatingFrom
事件,但当您恢复应用程序时,
OnNavigatedTo
不会被调用-仅当您在导航时才会调用此事件。因此,在您的情况下,当您单击“开始”时,预览将停止,当您返回时,预览将不再开始

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

另一件事是,要正确调试应用程序,您必须使用Visual Studio中“调试位置”选项卡的生命周期事件-当您对应用程序进行除错时,它不会被挂起,但当您正常运行应用程序时,它会在您点击“开始”后被挂起


还请注意,应用程序可能会处于非运行状态。有关的详细信息。

您描述的场景应触发
窗口.Current.VisibilityChanged
事件,在该事件中,您可以使用传递到事件处理程序的
VisibilityChangedEventArgs.Visible
在不可见时清除预览,在可见时初始化预览。您可以在页面\用户控件的已加载\已卸载处理程序中订阅\取消订阅
Window.Current.VisibilityChanged
事件

挂起/恢复生命周期事件不够充分的原因是,您上面提到的场景不会在特定时间决定性地调用这些事件,因为操作系统将仅基于内部策略挂起应用程序,该策略可能随操作系统版本更新而更改


另外,,我将避免使用导航处理程序,而是依赖加载的\卸载的处理程序,如果您必须将CaptureElement移动到其自己的UserControl中(而不是在页面中),这将允许正确进行初始化\清理,并避免WP调用OnNavigatedFrom而不调用OnNavigatedTo进行挂起\恢复的情况(加载\卸载将始终按顺序调用).

我在App.xaml.cs中也订阅了这些事件,但它们只有在我使用Visual Studio中的挂起/恢复按钮模拟生命周期事件时才会触发。当我只执行上面解释的场景时,它们不会触发。你是说这是正常的吗?在调试模式下,应用程序在进入后台时不会挂起,但如果我在没有调试器的情况下运行它,它会运行吗?我还不能在没有调试器的情况下运行应用程序,因为如果我尝试从应用程序列表启动它,它会短暂地显示启动屏幕,然后立即返回到应用程序列表。@noroom我也发现这很困惑,但现在它是如何工作的。在导航到on时设置断点和
OnNavigatedFrom
,您将看到第二个被命中,但第一个没有被命中。您的应用程序(不带调试器)在导航离开后将被挂起。奇怪的是,没有调试器您无法运行它-如果它退出,这意味着您可能有异常-尝试查找它。