私はnavigatetoロジックで接続された複数のページを持つアプリを持っています。UWPページのライフサイクル
ページの1つにウェブカムバインディングのメディア要素が含まれています。バックグラウンドモードに入った後(たとえば、システムメニューをクリックしてアプリの考えを最小化するなど)、カメラ要素が停止しました。したがって、私は
Windows.ApplicationModel.Core.CoreApplication.LeavingBackgroundイベントを購読し、カメラを再初期化します。現在のページがこのサブスクリプションとカメラ要素のページであれば、すべてが問題ありません。現在のページが別のページで、アプリケーションが復元されている場合、LeavingBackgroundはこのイベントが発生するため、隠されたページはカメラを再初期化しようとします。
私はthis.NavigationCacheMode = NavigationCacheMode.Disabledを設定しようとしました。メディア要素を含むページのインスタンスとLeavingBackgroundイベントのサブスクリプションは、MSDNに従ってNavigatedToイベントの後に理論的に破棄する必要があります。しかし、それは私が理解していない他の方法です。
カメラのページが一度インスタンス化され、永遠に、LeavingBackgoundイベントが常に受信されるようです - それは私にとっては悪いことです。
Window.Current.Content.GetType()とカメラ要素を含むページのタイプを比較しようとしましたが、このタイプには別のページのタイプが含まれることがありますが、Content.Contentでシフトされることもあります。 。同様に、
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.
}
}
それは私が試みた回避策の1つですが、私はそれがエレガントで正確ではないと思います。私はまだページが処分されない理由を理解していません。 –
静的イベントハンドラはアクティブな参照を保持しているため、静的イベント(LeavingBackgroundなど)を購読している限り、ページは廃棄されません。これは、メモリ診断ツールを使用して確認できます。 –
私のページではありません。エレガントでなく、本当に複雑すぎるあなたのデザインです。しかし、私は確信している、あなたはそれを変更する努力はありません。 –