UWPアプリの画面遷移で2画面戻る

UWPアプリを作成している中で、以下のような要件がありました。 画面1⇒画面2⇒画面3⇒画面4と遷移する。 画…

UWPアプリを作成している中で、以下のような要件がありました。

  • 画面1⇒画面2⇒画面3⇒画面4と遷移する。
  • 画面3でシステムの[戻る]ボタン押下時は、画面2に戻る。(1画面戻る)
  • 画面4でシステムの[戻る]ボタン押下時は、画面1に戻る。(2画面戻る)

戻るときにパラメータを渡せると良かったのですが、できないようですので、Singletonなクラスにフラグを持たせて判断することにしました。

 

画面1

public sealed partial class TestPage1 : Page
{
    public TestPage1()
    {
        this.InitializeComponent();
    }

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);
    
        PageCloseManager.Instance.MustGoBack = false;
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        this.Frame.Navigate(typeof(TestPage2));
    }
}

OnNavigatedToでフラグを初期化します。

 

画面2

public sealed partial class TestPage2 : Page
{
    public TestPage2()
    {
        this.InitializeComponent();
    }

     protected override void OnNavigatedTo(NavigationEventArgs e)
     {
         base.OnNavigatedTo(e);

         if (e.NavigationMode == NavigationMode.Back 
                                && PageCloseManager.Instance.MustGoBack)
         {
             Frame frame = (Frame)Window.Current.Content;
             if (frame.CanGoBack)
             {
                 var dispatcher 
                     = this.Dispatcher.RunAsync(
                       CoreDispatcherPriority.Normal, async () =>
                 {
                     await Task.Delay(0);
                     frame.GoBack();
                 });
            }
         }
     }

     private void Button_Click(object sender, RoutedEventArgs e)
     {
         this.Frame.Navigate(typeof(TestPage3));
     }
 }

OnNavigatedToで「戻ってきた」かつ「フラグがON」の場合、もう1画面戻るようにしています。
frame.GoBack()をそのまま呼ぶとタイミング的に上手くいかないので、Dispatcherを使用しています。

 

画面3

public sealed partial class TestPage3 : Page
{
    public TestPage3()
    {
        this.InitializeComponent();
    }

     private void Button_Click(object sender, RoutedEventArgs e)
     {
         this.Frame.Navigate(typeof(TestPage4));

         this.Frame.BackStack.RemoveAt(this.Frame.BackStackDepth - 1);
     }
 }

画面4に遷移した時点で画面3に戻ることはないので、遷移してすぐスタックから消しています。

 

画面4

public sealed partial class TestPage4 : Page
{
    public TestPage4()
    {
        this.InitializeComponent();
    }

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);

        PageCloseManager.Instance.MustGoBack = true;
    }
}

遷移したタイミングでフラグをONにします。

 

実行してみます。

■画面4でシステムの[戻る]ボタン押下時は、画面1に戻る。(2画面戻る)

画面1です。

2へボタン押下で、画面2へ遷移します。

3へボタン押下で、画面3へ遷移します。

4へボタン押下で、画面4へ遷移します。

システムの[戻る]ボタンを押下すると画面1まで戻ります。

 

■画面3でシステムの[戻る]ボタン押下時は、画面2に戻る。(1画面戻る)

画面1です。

2へボタン押下で、画面2へ遷移します。

3へボタン押下で、画面3へ遷移します。

システムの[戻る]ボタンを押下すると画面2に戻ります。

 

以上です。