MediaCapture和Window VisibilityChanged(MediaCapture

2019-10-21 16:23发布

[题]

在Windows Phone 8.1,什么当用户离开应用程序和OnSuspended事件触发之间的时间中到底发生了? 我有与该跨度来管理对象的能力,特别是MediaCpture对象的麻烦。

为了更好地说明问题,这里的情景:

  1. 用户与视频预览页面上被泵送至CaptureElement
  2. 用户点击开始按钮
  3. 用户点击返回按钮,返回到该页面与一个破碎MediaCapture

随着WinRT的没有一个ObscuredEventOnNavigatingFrom不火,除非你在同一帧转到另一个页面。 经过一番调查,我发现,触发该事件仅是Window.Current.VisibilityChanged

我已经先行一步,并把它挂在页面NavigatedToOnNavigatedFrom脱钩(见下文EX2)。 事件里面,我检查参数告知用户,如果应用程序被隐藏或显示和配置/初始化相应的(见下文实施例1,)。

[问题]

然而,这适用于连接调试器。 如果我这样做没有附加调试器,它不会重新初始化和频繁死机的相机 ,我不得不从字面上重新启动设备。

代码示例1(注:返回时e.Visible ==虚假离开应用程序和真)

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页面的构造。 与调试器完全不沾边,激活的活动将提供在WindowActivatedEventArgs的WindowActivationState参数。 像这样:

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

Answer 1:

我不知道,如果它不会是更适合使用挂起/恢复事件。 注意只有在这种情况下,你必须正确地调试它-它的行为,同时与运行有点不同/不带附加的调试 。

至于代码-中的OnNavigatedTo / OnNavigatedFrom挂钩的事件不是一个好主意-当OS暂停应用程序,您使用SuspensionManager然后OnNavigatedFrom将被调用,但是当你回到你的应用程序(恢复它),然后的OnNavigatedTo将不会被调用。

使用窗口事件也可以在这里工作,但为什么不订阅了一次,在构造函数中的某个地方? - 这是窗口范围内,因此在电话中只有一个窗口,它代表的应用程序,然后订阅一次。 在这种情况下,您可以添加识别窗口的当前页面一条线,如果该页面包含mediacapture然后处理(创建类似)。 那么你也可以出售/在情况下用户导航事件初始化不会离开你的应用程序,只是导航。



Answer 2:

见我在回答https://stackoverflow.com/a/28592882/3998132 。 使用Window.VisibilityChanged与装\空载处理程序应该解决您的问题,我相信你的页\用户控件相结合。

使用Window.Activated是不太理想的比Window.VisibilityChanged因为活化涉及可见并具有焦点,其中作为VisibilityChanged仅适用于可见性。 用于示出具有预览聚焦是不适用的。 由于Windows Phone上的Windows Store应用程序只能有一个窗口显示有使用没有区别要么但是如果你的应用程序变得普遍和运行在让我们在Windows 8+现代壳说(它可以显示与捕捉窗口功能多Store应用程序)或Windows 10桌面(可支持多种存储应用程序显示在同一时间),你会不会想停下来预览当用户从改变你的应用程序集中,但您的应用程序仍呈现。



文章来源: MediaCapture and Window VisibilityChanged