2017-04-15 218 views
2

我有多个页面的应用程序,与navigateto逻辑连接。UWP页面生命周期

其中一个页面包含具有网络摄像机绑定的媒体元素。进入后台模式(例如,通过最小化应用程序思考点击系统​​菜单)后,摄像机元素停止。因此,我订阅了
Windows.ApplicationModel.Core.CoreApplication.LeavingBackground事件并重新初始化相机。如果当前页面是具有此订阅和相机元素的页面,则一切正常。如果当前页面是另一个页面,并且应用程序已恢复,则无论如何都会发生LeavingBackground此事件,因此隐藏页面会尝试重新初始化摄像机。

我试图设置this.NavigationCacheMode = NavigationCacheMode.Disabled,因此包含媒体元素和订阅LeavingBackground事件的页面实例在理论上必须根据MSDN在NavigatedTo事件之后进行处理。但是,这是我不了解的另一种方式。

看来,相机页面实例化一次,永远,并将永远收到LeavingBackgound事件 - 这对我来说很糟糕。

我试图比较Window.Current.Content.GetType()与包含相机元素的页面类型,但有时这种类型包含另一个页面的类型,但有时它与Content.Content一起移动,所以我卡住了。

回答

3

我会假设你必须注销从页面导航离开时,事件处理程序:您需要处理挂起

public sealed partial class WebCamPage 
{ 
    public WebCamPage() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnNavigatedTo(NavigationEventArgs e) 
    { 
     Windows.ApplicationModel.Core.CoreApplication.LeavingBackground += OnLeavingBackground; 
    } 

    protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) 
    { 
     Windows.ApplicationModel.Core.CoreApplication.LeavingBackground -= OnLeavingBackground; 
    } 

    private void OnLeavingBackground(object sender, LeavingBackgroundEventArgs e) 
    { 
     // Your code here. 
    } 
} 
+0

这是我尝试过的解决方法之一,但我认为这不是优雅和正确的。我仍然不明白为什么页面不处理。 –

+2

只要订阅静态事件(如LeavingBackground),您的页面就不会被处置,因为该静态事件处理程序会在其上保留一个活动引用。你可以通过使用内存诊断工具来查看。 –

+0

这不是我的页面。这是你的设计,而不是优雅,真正的过于复杂。但我相信,你没有努力改变这一点。 –

1

和恢复活动,以清理和重新正确初始化相机一样,它显示在照相机样本应用程序:

https://github.com/Microsoft/Windows-universal-samples/blob/master/Samples/CameraStarterKit/cs/MainPage.xaml.cs

感谢, 斯特凡威克 - Windows 8开发平台

+0

这些事件对我而言毫无用处。试着理解我的问题。 –

+1

挂起/恢复是进入/离开背景时触发的事件 - 在其他情况下,系统暂停或恢复您的应用程序。看看相机样品。 –

+0

好的,会尝试。 –