質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.34%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

Q&A

1回答

128閲覧

Net.MauiのShellの画面変遷をキャンセルしたい

RC46

総合スコア9

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

0グッド

0クリップ

投稿2024/12/30 16:27

実現したいこと

MauiShell の 画面変遷をキャンセルしたい

前提

VisualStudioでMauiを使い、クロスプラットフォームの作成をしております
MVVM方式で作成しております
各クラスはDIコンテナで登録しています
Shellを使いPage管理をしています
ShellContentsPageは複数あります
他のPageから移動する際に警告用の画面を作成して、Cancelなら変遷しないようにしたい

発生している問題・エラーメッセージ

下記にネットのコードを参考に作成した デバッグでe.Cancelまで処理が進んだことは確認したが、 画面変遷がキャンセルされず、選択した画面に移動してしまう

該当のソースコード

C#

1public partial class AppShell : Shell 2{ 3 public AppShell(AppShellPageModel appShellPage) 4 { 5 InitializeComponent(); 6 BindingContext = appShellPage; 7 this.Navigating += Shell_NavigatingAsync; 8 } 9 10 private async void Shell_NavigatingAsync(object sender, ShellNavigatingEventArgs e) 11 { 12 bool result = await Utility.ShowConfirmationDialog("確認", "移動しますか?"); 13 if (!result) 14 { 15 e.Cancel(); 16 } 17 } 18}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

RC46

2024/12/31 05:32

コメントありがとうございます。 提示していただたい記述は見ていたのですが、よく理解していませんでした 再度、内容を理解して、記述したところ思ったPage変遷の実装ができました ありがとうございます
TN8001

2024/12/31 06:42

そうですかよかったです^^ お手数ですがうまくいったコードを回答しベストアンサーにして、質問を「解決済」にしてください。 [ヘルプ|質問をした後に自己解決してしまった](https://teratail.com/help#resolve-myself)
RC46

2024/12/31 06:47

コメントありがとうございます。 ベストアンサーに選びたいので同じ内容を回答欄に投稿いただけますでしょうか?
TN8001

2024/12/31 06:59

特にポイントにはこだわっていないので、RC46さんのほうで実際にうまくいったコードを回答いただけたらと思います。 蛇足ながらawaitを挟まない場合は、GetDeferralは必要ありません(提示リンク直前のコードもしていません) 非同期にすると一旦メソッドから抜ける形になるため、GetDeferral & Completeで知らせる必要があります。 MAUIではこういうパターンは、ほかでも出てきた気がします(非同期が多くなった苦肉の策っぽいですが^^;
RC46

2024/12/31 07:04 編集

ありがとうございます 内製プログラマーなので稚拙なコードですが掲載しました
TN8001

2024/12/31 07:09

ありがとうございます。 その回答に自分で「ベストアンサー」を付けてください^^
guest

回答1

0

C#_Maui

1public partial class AppShell : Shell 2{ 3 readonly Logger log = Logger.GetInstance(); 4 5 /// <summary> 6 /// 初回起動確認 7 /// </summary> 8 private bool IsFirstInitial { get; set; } = false; 9 10 public AppShell(AppShellPageModel appShellPage) 11 { 12 InitializeComponent(); 13 BindingContext = appShellPage; 14 IsFirstInitial = true; 15 } 16 17 /// <summary> 18 /// 画面変遷時にイベント発生 19 /// OKなら指定に画面に移動させる 20 /// ※初回起動時は実行しない 21 /// </summary> 22 protected override async void OnNavigating(ShellNavigatingEventArgs args) 23 { 24 if (IsFirstInitial == true) 25 { 26 base.OnNavigating(args); 27 ShellNavigatingDeferral token = args.GetDeferral(); 28 try 29 { 30 bool result = await Application.Current.MainPage.DisplayAlert("確認", "移動しますか?", "OK", "Cancel"); 31 32 if (!result) 33 { 34 args.Cancel(); 35 } 36 } 37 catch (Exception ex) 38 { 39 log.Error(ex.Message); 40 } 41 finally 42 { 43 token.Complete(); 44 } 45 } 46 } 47}

投稿2024/12/31 07:00

RC46

総合スコア9

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.34%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問