UWP页面生命周期

3

我有一个包含多个页面的应用程序,使用Navigateto逻辑连接这些页面。

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

我尝试设置this.NavigationCacheMode = NavigationCacheMode.Disabled,因此包含媒体元素和订阅LeavingBackground事件的页面实例在NavigatedTo事件后理论上必须被处理,但它的工作方式与我不理解的方式相反。

似乎相机页面只实例化一次,永远不会被处理,并始终接收LeavingBackgound事件 - 对我来说这很糟糕。

我尝试将Window.Current.Content.GetType()与包含相机元素的页面类型进行比较,但有时该类型包含其他页面的类型,但有时它会随着Content.Content而改变,所以我陷入困境。

2个回答

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.
    }
}

这是我尝试过的其中一种解决方法,但我觉得它既不优雅也不正确。我仍然不明白为什么页面没有被释放。 - Dmitry Andreev
2
只要页面订阅了静态事件(如LeavingBackground),它就不会被处理,因为静态事件处理程序会对其保持活动引用。您可以使用内存诊断工具查看此内容。 - Stefan Wick MSFT
这不是我的页面。这是你的设计,不够优雅,确实过于复杂了。但我相信,你没有努力去改变它。 - Dmitry Andreev

1

这些事件对我的情况没有任何用处。请尝试理解我的问题。 - Dmitry Andreev
1
挂起/恢复是在进入/离开后台时触发的事件 - 在其他情况下,系统会暂停或恢复您的应用程序。请查看相机示例。 - Stefan Wick MSFT
好的,我会尝试。 - Dmitry Andreev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接