質問: false; } } ``` ※ 処理は続行できるようになるものの、メインの処理でもともと定義していた変数参照できなくなる... という状態です。よろしくお願いします。
回答: 処理を途中で中断して再開する、というとコルーチンですかね。 .NETはネイティブにはサポートしていませんが、質問者さんが試されていたような * どこまで進んだかという状態や、残しておきたい変数をフィールドに格納しておき * それを見て自動的に続きの地点までジャンプする といった形に自動変換する構文が最近の C# には用意されています。 で、今回の場合、Teratailに投稿された同質問の回答にもありますが、非同期メソッドを使うとスムーズに書けるかと思います。概要については下記サイトなどが参考になります。 非同期メソッド - C# によるプログラミング入門 | ++C++; // 未確認飛行 C ただ「何らかのボタンが押されるまで待つ」といった非同期メソッドは用意されていませんから、代わりに `TaskCompletionSource`.aspx) を使います。 例えばClick_DownloadFiles側ではこのように書いておき・・・ ``` // ここに async を付ける public async void Click_DownloadFiles(object sender, RoutedEventArgs e) { // 略 if (elementExist()) { var tcs = new TaskCompletionSource(); // PasswordInput.xaml.csからアクセスできるように this.PasswordInputCompletionSource = tcs; url = string.Format("views/Pages/PasswordInput.xaml"); Frame.MainFrame.Navigate(new URI(url, UriKind.Relative)); // tcs.SetResult()が呼び出されるまで**非同期に**待つ // 実際には一旦このメソッドは終了し、後で再び呼び出されることになる // SetResultに渡された引数はここで戻り値として得られる var password = await tcs.Task; // paswordを使って何かする // (Bで使いたいなら先に変数を定義しておく等) } B(); } ``` パスワード入力画面では次のようにして処理を戻します。 ``` private void Click_DownloadFilesAfterInput(object sender, RoutedEventArgs e) { // 用意しておいたTaskCompletionSourceを取り出し、 var cts = ((dynamic)this.DataContext).PasswordInputCompletionSource; // 結果を設定する(とClick_DownloadFilesが再開する) cts.SetResult(password); } ``` ここではパスワードの受け渡しも `TaskCompletionSource` を通して行っていますので、`Password` プロパティ?を公開する必要はありません。 ※値の受け渡しをしない `TaskCompletionSource` はないので、もしパスワードの受け渡し方法は変えたくない場合は、object なり bool なり適当な値を代わりに渡すとよいでしょう。