LoginSignup
saka_3776
@saka_3776

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

[UWP]セカンダリウィンドウを生成&閉じるを繰り返すプログラムにて、2巡目にエラー(AppWindowクラス)

解決したいこと

VisualStudio2022の環境でC#、UWPで作成しています。
ループイベント内にてある条件でのトリガーをもとにセカンダリウィンドウを生成し、同じく生成ウィンドウを閉じるという処理を繰り返すプログラムの部分を作成しています。
(Windows.UI.WindowManagement.AppWindowクラスを利用)

同時に存在する生成ウィンドウは1つまでとします。
「生成→閉じる」の一巡目はうまくいきますが、
「生成→閉じる→生成」となる際にTryShowAsyncで例外エラー"要素が見つかりません"とメッセージが出ます。①

また、「生成→閉じる→閉じる」で処理が走るパターン時にCloseAsyncで例外エラー"appWindow が null でした"とメッセージが出ます。②

この現象の解決方法を教えていただけないでしょうか?

発生エラーメッセージ

エラーメッセージ①

System.Exception
  HResult=0x80070490
  Message=要素が見つかりません。 (Exception from HRESULT: 0x80070490)
  Source=<例外のソースを評価できません>
  スタック トレース:
<例外のスタック トレースを評価できません>

エラー詳細.JPG

エラーメッセージ②

System.NullReferenceException
  HResult=0x80004003
  Message=Object reference not set to an instance of an object.
  Source=sensor_uwp23
  スタック トレース:

エラー詳細close.JPG

該当サンプルコード

        /// <summary>
        /// セカンダリウィンドウの生成
        /// </summary>
        private async void ShowCoverWindow()
        {
            // 呼び出しウィンドウを全画面モードで表示する
            ApplicationView.PreferredLaunchWindowingMode = ApplicationViewWindowingMode.FullScreen;

            // 新規ウィンドウを生成
            if (!blnCovered)
            {
                // インスタンス作成
                appWindow = await AppWindow.TryCreateAsync();
                // ウィンドウコンテンツを作成
                appWindowFrame = new Frame();
                // ウィンドウを閉じるときに参照とXAMLリソースを解放
                appWindow.Closed += delegate { appWindow = null; appWindowFrame.Content = null; };
                // 新規ウィンドウに表示するページにフレーム移動とパラメータ受け渡し
                appWindowFrame.Navigate(typeof(Cover), val);
                // XAMLコンテンツをappWindowに接続
                ElementCompositionPreview.SetAppWindowContent(appWindow, appWindowFrame);
                // 新規ウィンドウ生成済みフラグ
                blnCovered = true;
            }

            // ウィンドウ表示
            if (blnCovered)
            {
                await appWindow.TryShowAsync(); // ⇒⇒2巡目走る際、エラー発生①
                Window.Current.Activate();
            }

        }

        /// <summary>
        /// セカンダリウィンドウ閉じる
        /// </summary>
        private async void CloseCoverWindow()
        {
            // ウィンドウ生成状態を確認して実行
            if (blnCovered)
            {
                await Task.Delay(2000);
                // ウィンドウを閉じる
                await appWindow.CloseAsync(); // ⇒⇒2巡目走る際、エラー発生②

                // フラグを戻す
                blnCovered = false;
                
            }
        }
0

1Answer

Comments

  1. @saka_3776

    Questioner
    下手なことをやっていましたが解消されたみたいです。ご回答ありがとうございました!

Your answer might help someone💌