このページは役に立ちましたか。
このページのコンテンツについての ご意見をお待ちしております
その他にご意見はありますか。
残り 1500 文字
エクスポート (0) 印刷
すべて展開

方法: Windows Phone のバック スタックを使用して操作する

2012/02/09

このトピックでは、バック スタックと呼ばれる戻るナビゲーション履歴を操作することによって、アプリケーションのナビゲーションを変更する方法を説明します。Windows Phone OS 7.1 では、ナビゲーション履歴を操作し、検査を可能にする機能が NavigationService API に追加されました。このトピックでは、これらのプロパティとメソッドを使用して、バック スタックを検査し、エントリを削除して、それらの変更がアプリケーションのナビゲーションに与える影響を示します。この機能を示すアプリケーションの完成したサンプルをダウンロードできます。詳細については、「ナビゲーション バックスタックのサンプル」を参照してください。

注注:

次の手順は、Visual Studio 2010 Express for Windows Phone 向けです。 Visual Studio 2010 Professional や Visual Studio 2010 Ultimate のアドインを使用している場合は、メニュー コマンドやウィンドウのレイアウトが多少異なる場合があります。

このトピックは、次のセクションで構成されています。

注注:

ナビゲーション履歴バック スタックの用語は、このトピック全体で区別なく使用しており、NavigationService.BackStack プロパティで公開される戻るナビゲーション履歴を参照しています。

アプリケーションのナビゲーション履歴は、スタックと呼ばれる後入れ先出し構造で表されます。これは、アプリケーションの戻るナビゲーションを表すスタック構造に一連のページを格納するため、ここではバック スタックとも呼びます。このスタックはプレートのスタックとして考えてください。スタックに追加した最後のプレートは削除可能な最初のプレートになります。最新の項目はスタックの一番上に追加されます。これは、プッシュ操作と呼ばれます。スタックの一番上の項目を削除することは、ポップ操作と呼ばれます。スタックから何かを取り出すには、スタックの一番上から 1 つずつ項目を削除することによってのみ実行できます。スタックの概念を次の図に示します。

BackStack のスタック表示

アプリケーションのページが Navigate を呼び出すと、現在のページがバック スタックに入れられ、宛先のページの新しいインスタンスが作成され、表示されます。アプリケーションのページをナビゲートすると、エントリがこのスタックに追加されます。ページが GoBack を呼び出すか、ユーザーが電話の [戻る] ボタンを押すと、現在のページが破棄され、スタックの一番上のページがバック スタックからポップされ、表示されます。この戻るナビゲーションは、スタックにエントリがなくなるまで続行します。この時点で、電話の [戻る] ボタンをタップすると、アプリケーションが終了します。

ほとんどのアプリケーションはバック スタックを操作する必要がなく、既定のナビゲーションで完全に正常に機能しますが、一部の開発者はアプリケーションの最高の操作性を実現するため、ナビゲーション履歴を調整する必要があります。これを実行したいと考える理由は多くあります。たとえば、アプリケーションでログイン ページを使用することがあります。ユーザーがログインしたら、そのページに戻ることはできないようにしたい場合があります。このトピックでは、BackStack プロパティと RemoveBackEntry メソッドを使用して、ナビゲーション履歴を操作する方法を示します。

このセクションでは、アプリケーションでナビゲーション履歴またはバック スタックを視覚化し、アプリケーションの実行中にバック スタックを簡単に検査できるようにする方法を説明します。アプリケーションは複数のページで構成されています。次のページに移動する場合、バック スタックにどんなエントリがあるか確認したいと考えます。さらに、簡単にエントリを削除し、バック スタックへのすべての更新を確認したいとも考えます。このアプリケーションでは、画面上のリストとして、バック スタックを視覚化します。これを次の図に示します。これは、バック スタックの概念を理解できるようにするために実行します。アプリケーションでバック スタックエントリを表示する必要はありませんが、開発者しだいです。

BackStack 初期 UI

上記の図の灰色の領域はアプリケーションのバック スタックを視覚化したものです。アプリケーションを移動すると、リストにナビゲーション履歴からのエントリが入力されます。[Pop Last] ボタンと [Pop To Selected] ボタンを使用して、ナビゲーション履歴を変更します。この灰色の領域は、個々のページ上にありません。代わりに、リストがアプリケーションの RootFrame に集中的に追加されます。RootFrame オブジェクトはアプリケーションに関連付けられている PhoneApplicationFrame です。アプリケーションごとに 1 つの RootFrame があります。ユーザーがページに移動すると、ナビゲーション フレームワークによって、アプリケーションの各ページまたは PhoneApplicationPage のインスタンスがこのフレームのコンテンツとして設定されます。新しい Windows Phone アプリケーションの作成時に取得する RootFrame オブジェクトの既定のテンプレートに、アプリケーション ページとシステム トレイやアプリケーションのアプリケーション バーなどのその他の要素が表示されます。この例では、アプリケーション ページを表示しますが、画面の下部にリストとしてバック スタックを表示する余地を残します。ページからページに移動すると、この集中リストが更新され、アプリケーションのナビゲーション履歴、またはバック スタックの現在の状態が反映されます。Windows Phone アプリケーションの構造の詳細については、「Windows Phone のフレームおよびページ ナビゲーションの概要」を参照してください。

バック スタックを視覚化するには

  1. Visual Studio 2010 Express for Windows Phone で、[ファイル] メニューの [新しいプロジェクト] をクリックして新しいプロジェクトを作成します。

  2. [新しいプロジェクト] ウィンドウが表示されます。Visual C# のテンプレートを展開してから、Silverlight for Windows Phone のテンプレートを選択します。

  3. Windows Phone アプリケーション テンプレートを選択します。[名前] に選択した名前を入力します。

  4. [OK] をクリックします。Windows Phone の [プラットフォームの選択] ウィンドウが表示されます。[Windows Phone OS のターゲット バージョン] の [Windows Phone OS 7.1] を選択します。

  5. [OK] をクリックします。新しいプロジェクトが作成され、Visual Studio のデザイナー ウィンドウに MainPage.xaml が表示されます。

  6. 次の手順はアプリケーションの RootFrame によって使用されるテンプレートを変更して、バック スタックを視覚化します。これは RootFrame のカスタム ControlTemplateListBox を配置して実行します。この新しいテンプレートは、App.xaml ページの Application.Resources セクションに定義します。App.xaml ファイルで、Application.Resources エントリを次のマークアップで置き換えます。テンプレートは 2 行のグリッドから構成されます。ContentPresenter はグリッドの最初の行にあります。ここには、各ページのコンテンツが表示されます。別のグリッドをこのグリッドの 2 行目に追加し、バック スタックの UI を含めます。この UI はバック スタックの各エントリを表示する ListBox と、バック スタックを操作するためのいくつかのボタンから構成されます。

    
    <Application.Resources>
            <ControlTemplate x:Name="NewFrameTemplate">
                <Grid x:Name="ClientArea">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*"/>
                        <RowDefinition Height="Auto"/>
                    </Grid.RowDefinitions>
                    <ContentPresenter Grid.Row="0"/>
                    <Border Grid.Row="1" BorderBrush="{StaticResource PhoneForegroundBrush}" BorderThickness="{StaticResource PhoneBorderThickness}" Height="300">
                        <Grid x:Name="ContentPanel" Background="{StaticResource PhoneSemitransparentBrush}">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition />
                                <RowDefinition Height="Auto"/>
                            </Grid.RowDefinitions>
                            <TextBlock  Grid.Row="0" x:Name="CurrentPage" Style="{StaticResource PhoneTextSubtleStyle}" HorizontalAlignment="Center"/>
                            <ListBox Grid.Row="1" ItemsSource="{Binding}" x:Name="HistoryList" 
                                    HorizontalAlignment="Center" Height="300">
                                <ListBox.ItemTemplate>
                                    <DataTemplate>
                                        <Border BorderBrush="{StaticResource PhoneForegroundBrush}" BorderThickness="{StaticResource PhoneBorderThickness}" Width="300" Margin="5" 
                                                Background="DarkGray" HorizontalAlignment="Center">
                                            <TextBlock Text="{Binding}"/>
                                        </Border>
                                    </DataTemplate>
                                </ListBox.ItemTemplate>
                            </ListBox>
                            <StackPanel Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Center">
                                <Button Content="Pop Last" x:Name="btnPopLast" IsEnabled="false"/>
                                <Button Content="Pop To Selected" x:Name="btnPopToSelected" IsEnabled="false"/>
                            </StackPanel>
                        </Grid>
                    </Border>
    
                </Grid>
            </ControlTemplate>
        </Application.Resources>
    
    
  7. App.xaml.cs コード分離ファイルで、App クラスの先頭に、次の宣言を追加します。これらは、カスタム テンプレートから作成された UI 要素を参照するために使用されます。

    
    // UI controls on the RootFrame template.
    ListBox historyListBox;            // ListBox for listing the navigation history
    Button popLastButton;              // Button to pop the newest entry from the back stack
    Button popToSelectedButton;        // Button to pop all entries in the back stack up to the selected entry
    TextBlock currentPageTextBlock;    // TextBlock to display the current page the user is on
    
    
  8. App.xaml ページの分離コード ファイルで、コンストラクターの InitializePhoneApplication の呼び出しの直後に、次のコード行を追加します。まず、RootFrame のテンプレートを NewFrameTemplate に設定します。これは手順 6 で定義したテンプレートの名前です。テンプレート上のボタンのイベント ハンドラーもここにフックします。最後に、履歴を更新するために、RootFrameNavigated イベントにデリゲートを定義します。

    
    // Set the template for the RootFrame to the new template we created in the Application.Resources in App.xaml
    RootFrame.Template = Resources["NewFrameTemplate"] as ControlTemplate;
    RootFrame.ApplyTemplate();
    
    popToSelectedButton = (VisualTreeHelper.GetChild(RootFrame, 0) as FrameworkElement).FindName("btnPopToSelected") as Button;
    popToSelectedButton.Click += new RoutedEventHandler(PopToSelectedButton_Click);
    
    popLastButton = (VisualTreeHelper.GetChild(RootFrame, 0) as FrameworkElement).FindName("btnPopLast") as Button;
    popLastButton.Click += new RoutedEventHandler(PopLastButton_Click);
    
    currentPageTextBlock = (VisualTreeHelper.GetChild(RootFrame, 0) as FrameworkElement).FindName("CurrentPage") as TextBlock;
    
    historyListBox = (VisualTreeHelper.GetChild(RootFrame, 0) as FrameworkElement).FindName("HistoryList") as ListBox;
    historyListBox.SelectionChanged += new SelectionChangedEventHandler(HistoryList_SelectionChanged);
    
    // Update the navigation history listbox whenever a navigation happens in the application
    RootFrame.Navigated += delegate { RootFrame.Dispatcher.BeginInvoke(delegate { UpdateHistory(); }); };
    
    
  9. App.xaml ページの分離コード ファイルに次のメソッドを追加します。UpdateHistory はナビゲーション バック スタックの UI を更新します。これは、RootFrameNavigated イベントが発生した場合に呼び出されます。このイベントはアプリケーションで何らかのナビゲーションが行われた場合に発生します。メソッドは BackStack プロパティのすべてのエントリを反復処理し、それらを ListBox に追加します。さらに、現在のページの URI も表示します。ナビゲーション バック スタックにエントリがある場合、[Pop Last] ボタンが有効になります。HistoryList_SelectionChanged は、ナビゲーション履歴リスト内の項目が選択されたかどうかに応じて、[Pop To Selected] ボタンを有効または無効にします。

    
    /// <summary>
    /// Use the BackStack property to refresh the navigation history list box with the latest history.
    /// </summary>
    void UpdateHistory()
    {
       historyListBox.Items.Clear();
       int i = 0;
    
       foreach (JournalEntry journalEntry in RootFrame.BackStack.Reverse())
       {
          historyListBox.Items.Insert(0, i + ": " + journalEntry.Source);
          i++;
       }
       currentPageTextBlock.Text = "[" + RootFrame.Source + "]";
       if (popLastButton != null)
       {
           popLastButton.IsEnabled = (historyListBox.Items.Count() > 0);
       }
    }
    
    /// <summary>
    /// Handle the SelectionChanged event for navigation history list.
    /// </summary>
    private void HistoryList_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
       if (historyListBox != null && popToSelectedButton != null)
       {
           popToSelectedButton.IsEnabled = (historyListBox.SelectedItems.Count > 0) ? true : false;
       }
    }
    
    
  10. App.xaml ページの分離コード ファイルに次のメソッドを追加します。これは、[Pop Last] ボタンのクリック イベントを処理します。ユーザーがこのボタンをタップすると、バック スタックに最後に追加されたエントリが削除されます。このメソッドは、RootFrameRemoveBackEntry を使用します。エントリの削除後、UpdateHistory を呼び出して、バック スタック エントリのリストが更新されます。

    
    /// <summary>
    /// Remove the last entry from the back stack.
    /// </summary>
    private void PopLastButton_Click(object sender, RoutedEventArgs e)
    {
        // If RemoveBackEntry is called on an empty back stack, an InvalidOperationException is thrown.
        // Check to make sure the back stack has entries before calling RemoveBackEntry.
        if (RootFrame.BackStack.Count() > 0)
            RootFrame.RemoveBackEntry();
    
        // Refresh the history list since the back stack has been modified.
        UpdateHistory();
    }
    
    
  11. App.xaml ページの分離コード ファイルに次のメソッドを追加します。ユーザーがバック スタックの項目を選択し、[Pop To Selected] をタップすると、選択したエントリまでのすべてのエントリが、バック スタックから削除されます。RootFrameRemoveBackEntry メソッドを使用して、バック スタックから各エントリが削除されます。エントリの削除後、UpdateHistory を呼び出して、バック スタック UI を更新します。

    
    /// <summary>
    /// Remove all entries from the back stack up to the selected item, but not including it.
    /// </summary>
    private void PopToSelectedButton_Click(object sender, RoutedEventArgs e)
    {
        // Make sure something has been selected.
        if (historyListBox != null && historyListBox.SelectedIndex >= 0)
        {
            for (int i = 0; i < historyListBox.SelectedIndex; i++)
            {
                RootFrame.RemoveBackEntry();
            }
            // Refresh the history list since the back stack has been modified.
            UpdateHistory();
        }
     }
    
    

このセクションでは、アプリケーションの RootFrame にカスタム テンプレートを追加して、アプリケーションを移動したときに、バック スタックを検査し、変更できるようにする方法について説明しました。この機能を示すには、アプリケーションに複数のページを追加する必要があります。これについて、次のセクションで説明します。

ナビゲーション履歴の検査と操作を示すには、アプリケーションに複数のページを追加する必要があります。このセクションでは、これらのページをアプリケーションに追加する方法を説明します。例は、MainPage.xamlPage1.xamlPage2.xamlPage3.xaml の 4 つのページから構成されます。各ページは同じように構築され、同じ UI を使用します。結果として、各ページで、次の手順を繰り返します。この例では、ヘルパー メソッドを使用したり、UserControl で UI をラップしたりして、コードの再利用を試みていません。

アプリケーションにページを追加するには

  1. [プロジェクト]、[新しい項目の追加] メニュー コマンドを選択して、プロジェクトに新しいページを追加します。[新しい項目の追加] ウィンドウが表示されます。追加する項目のリストの [Windows Phone Portrait Page] を選択して、[名前] フィールドに「Page1.xaml」と入力します。[追加] をクリックして、新しいページをプロジェクトに追加します。Page1.xaml という新しいページがプロジェクトに追加されました。

  2. 最初に実行することは、ページ UI を定義することです。Page1.xaml で、ContentPanel という名前のグリッドを次のコードで置き換えます。これは、ページを [スタート] 画面に固定するかどうかを切り替えるために使用される CheckBox と、アプリケーションで次のページが存在する場合に、次のページに移動するための Button を作成します。ページを電話の [スタート] 画面に固定することは、きわめて興味深い例で、ここではアプリケーションを起動するために [スタート] 画面のページ タイルをクリックしたときのバック スタックの状態を示すために使用しています。次のコードに示すイベント ハンドラーについて、後の手順で説明します。

    
    <!--ContentPanel - place additional content here-->
    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <CheckBox x:Name="PinToStartCheckBox" Content="Pin To Start" IsChecked="False" HorizontalAlignment="Center" 
                  Click="PinToStartCheckBox_Click"/>
        <Button x:Name="btnNext" Content="Next Page"  Height="80" VerticalAlignment="Bottom" 
                Click="btnNext_Click"/>
    </Grid>
    
    
  3. このページの分離コード ファイルで、次の using ディレクティブを追加します。

    using Microsoft.Phone.Shell;
    
    
  4. クラスの先頭に、次の変数宣言を追加します。

    
    // The URI string of the next page to navigate to from this page.
    // String.Empty here means that there is no next page.
    private string nextPage;
    
    
  5. クラス コンストラクターの InitializeComponent() の後に、次のコード行を追加します。

    
    // Set the application title - use the same application title on each page.
    ApplicationTitle.Text = "SDK BACKSTACK SAMPLE";
    
    // Set a unique page title. In this example, we will use "page 1", "page 2", and so on.
    PageTitle.Text = "page 1";
    
    // Set the URI string of the next page, or String.Empty if there is no next page.
    nextPage = "/Page2.xaml";
    
    
    注注:

    この手順は追加するページごとに繰り返すため、作成したページごとに PageTitle.TextnextPage を更新することを忘れないでください。

  6. 次のメソッドを追加して、OnNavigatedTo イベント ハンドラーをオーバーライドします。このページに nextPage 変数が設定されている場合、ここに [Next Page] ボタンが表示されます。このページのタイルが存在するかどうかに応じて、[Pin To Start] チェック ボックスが設定されます。

    
    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
       base.OnNavigatedTo(e);
       
       // Show the Next button, if we have defined a next page.
       btnNext.Visibility = (String.IsNullOrWhiteSpace(nextPage)) ? Visibility.Collapsed : Visibility.Visible;
    
       if (ShellTile.ActiveTiles.FirstOrDefault(o => o.NavigationUri.ToString().Contains(NavigationService.Source.ToString())) == null)
          PinToStartCheckBox.IsChecked = false;
       else
          PinToStartCheckBox.IsChecked = true;
    }
    
    
  7. ページの [Next Page] ボタンの Click イベントを処理するために、次のメソッドを追加します。このページで、nextpage 変数が定義されていると、Navigate メソッドが呼び出され、そのページに移動します。

    
    /// <summary>
    /// Navigate to the next page.
    /// </summary>
    private void btnNext_Click(object sender, RoutedEventArgs e)
    {
         // Make sure to attempt navigation only if we have defined a next page.
         if (!String.IsNullOrWhiteSpace(nextPage))
         {
            this.NavigationService.Navigate(new Uri(nextPage, UriKind.Relative));
         }
    }
    
    
  8. ページの [Pin To Start] チェック ボックスの Click イベントを処理するために、次のメソッドを追加します。これはトグルのように機能します。[スタート] 画面にこのページのタイルが既に存在する場合は、削除されます。[スタート] 画面にこのページのタイルが存在しない場合は、追加されます。タイルの詳細については、「Windows Phone のタイル」を参照してください。

    
    /// <summary>
    /// Toggle pinning a Tile for this page on the Start screen.
    /// </summary>
    private void PinToStartCheckBox_Click(object sender, RoutedEventArgs e)
    {
       // Try to find a Tile that has this page's URI.
       ShellTile tile = ShellTile.ActiveTiles.FirstOrDefault(o => o.NavigationUri.ToString().Contains(NavigationService.Source.ToString()));
    
       if (tile == null)
       {
          // No Tile was found, so add one for this page.
          StandardTileData tileData = new StandardTileData { Title = PageTitle.Text };
          ShellTile.Create(new Uri(NavigationService.Source.ToString(), UriKind.Relative), tileData);
       }
       else
       {
          // A Tile was found, so remove it.
          tile.Delete();
       }
    }
    
    
    注注:

    アプリケーションで、ユーザーがページを固定できるようにする場合、ユーザーがアプリケーションのルートにすぐに戻ることができるようにする [home] ボタンが必要であるかどうかを考慮する必要があります。ホーム ボタンの実装は、アプリケーションのホーム ページに移動し、ナビゲーション バック スタック全体をクリアします。各ナビゲーション シナリオを調査し、各事例でこの機能が必要であるかどうかを判断します。固定されたページが、連絡先情報などの自己完結型である場合、ユーザーはページをタップし、情報を調べて、アプリケーションに戻る可能性があります。この事例でアプリケーションに戻ることは、ハードウェアの [戻る] ボタンを押して実現できます。固定されたページが、ユーザーがそこから深く移動していくアプリケーションのエントリ ポイントである場合、アプリケーションのルートにすばやく戻る方法が必要になる可能性があります。たとえば、固定されたページがショッピング カードである場合、ユーザーがショッピング カートで購入を終了し、再度ショッピングを始めたいと考える場合があります。この場合、ユーザーにホーム ボタンを提供すると、アプリケーションの開始に戻るために必要なタップ数が減るため、ユーザーの操作性が向上します。

  9. 上記の手順では、ページを追加し、このアプリケーションで使用するためにそれを更新する方法を説明しています。アプリケーションを完成させるため、次のように、これらの手順を、MainPage、Page2、Page 3 で繰り返す必要があります。

    ページ名

    新しいページかどうか

    手順 5 の変更

    MainPage.xaml

    いいえ。このページはアプリケーションの作成時に作成されました。このページの手順 2 ~ 8 を繰り返します。

    PageTitle.Text = “main”;

    nextPage = “/Page1.xaml”;

    Page2.xaml

    はい。このページの手順 1 ~ 8 を繰り返します。

    PageTitle.Text = “page 2”;

    nextPage = “/Page3.xaml”;

    Page3.xaml

    はい。このページの手順 1 ~ 8 を繰り返します。

    PageTitle.Text = “page 3”;

    nextPage = String.Empty

    ページ 3 はアプリケーションの最後のページのため、ページ 3 から先に移動しないように、次のページに String.Empty を指定します。

このセクションを完了した場合のソリューション エクスプローラーのソリューションを次の図に示します。アプリケーションには 4 つのページがあり、これらのページの進むナビゲーションは、MainPage.xaml -> Page1.xaml -> Page2.xaml -> Page3.xaml のようになります。

BackStack の「方法」でのソリューション表示

このセクションでは、このトピックで生成されたアプリケーションを実行する方法について説明します。

アプリケーションをテストするには

  1. [デバッグ]、[デバッグ開始] の順にメニュー コマンドを選択してアプリケーションを実行します。

  2. アプリケーションが起動し、MainPage.xaml ページが表示されます。これを次の図に示します。画面の下半分にバック スタックが視覚的に表示されます。この時点では、ナビゲーション履歴に何もないため、リストは空です。現在のページは [/MainPage.xaml] と示されます。

    BackStack 初期 UI
  3. [Next Page] ボタンをタップします。ページが page 1 に変わり、バックスタック リストに /MainPage.xaml が格納されたことがわかります。

  4. [Next Page] ボタンを再度タップします。現在のページは page 2 です。これでバック スタックに /Page1.xaml/MainPage.xaml の 2 つのエントリが格納されます。スタックとして、一番上に最新のエントリが表示され、一番下に最も古いエントリが表示されます。これを次の図に示します。

    BackStack の「方法」での暫定的な UI
  5. [Pop Last] ボタンをタップします。バック スタック リストから /Page1.xaml エントリが削除されます。

  6. デバイスのハードウェア [戻る] ボタンをタップします。ページ main page が表示され、バック スタックが空になります。これは、前の手順で、バック スタックから /Page1.xaml を削除し、戻るナビゲーションが Page 2 -> Page1 -> MainPage から Page2 -> MainPage に変更されたために発生しました。

  7. main page の [Next Page] ボタンをタップします。page 1 ページが表示されます。バック スタックには 1 つのエントリ /MainPage.xaml があります。

  8. page 1 の [Next Page] ボタンをタップします。page 2 ページが表示されます。バック スタックに /Page1.xaml/MainPage.xaml の 2 つのエントリがあります。

  9. page 2 の [Pin To Start] をタップします。

  10. デバイスの [スタート] 画面に、page 2 というタイルが作成されます。

  11. 上記の手順で作成したタイルをタップします。アプリケーションが起動し、page 2 が表示されます。バック スタックが空であることにも注意してください。デバイスの [戻る] ボタンをタップすると、アプリケーションが終了します。この状態の例を次の図に示します。page 2 がデバイスの [スタート] 画面に固定されています。タイルがタップされた後、アプリケーションが起動し、Page2 が表示されます。この図に示すバック スタックは空です。

    タイルからの移動時の BackStack の状態。

表示:
© 2015 Microsoft