UWPアプリの画面ライフサイクル　メモ

UWPアプリ開発初心者です。
画面遷移周りを調べてみたのでメモ。

# 画面遷移
画面遷移したいときは[Frame.Navigate(Type)](https://msdn.microsoft.com/ja-jp/library/windows/apps/hh702394.aspx)を利用。
第2引数のObjectにパラメータを渡せば、ページ遷移時に任意のパラメータの受け渡しが可能。

PageAからPageBに遷移する場合はPageAで以下を呼ぶ。

```
// パラメータなし
Frame.Navigate(typeof(PageB));

// パラメータあり
Frame.Navigate(typeof(PageB), "パラメーター");
```

# ページ遷移時のイベント
ページ遷移時に遷移元、遷移先で呼び出されるメソッド。
・OnNavigatedTo
・OnNavigatingFrom
・OnNavigatedFrom

詳細は後述するが、通常以下のシーケンスで呼ばれる

| 遷移元           | 遷移先           |
|:----------------|:----------------|
| OnNavigatingFrom|                 |
| OnNavigatedFrom |                 |
|                 | OnNavigatedTo   |

## OnNavigatedTo
[Page.OnNavigatedTo(NavigationEventArgs)](https://msdn.microsoft.com/ja-jp/library/windows/apps/windows.ui.xaml.controls.page.onnavigatedto)
遷移先のページがアクティブになる前に呼び出される。
AndroidのonCreateの様な生成時のみ呼ばれるイベントは無いようです。

|               | Windows       | Android       | iOS           |
|:--------------|:--------------|:--------------|:--------------|
| 画面生成時     |               | onCreate      | viewDidLoad   |
| 前面移動前     | OnNavigateTo  | onResume      | viewWillAppear|
| 前面移動後     |               |               | viewDidAppear |

## OnNavigatingFrom
[Page.OnNavigatingFrom(NavigationEventArgs)](https://msdn.microsoft.com/library/windows/apps/br227509)
遷移元のページがディアクティブになる前に呼び出される。

このタイミングではまだページ遷移をキャンセルすることが可能。

```
protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
    // キャンセルフラグをtrueにする
    e.Cancel = true;
    base.OnNavigatingFrom(e);
}
```

## OnNavigatiedFrom
[Page.OnNavigatedFrom(NavigationEventArgs)](https://msdn.microsoft.com/library/windows/apps/br227507)
遷移元のページがディアクティブになった後に呼び出される。

|               | Windows         | Android       | iOS              |
|:--------------|:----------------|:--------------|:-----------------|
| 後面移動前     | OnNavigatingFrom| onPause       | viewWillDisappear|
| 後面移動後     | OnNavigatedFrom |               | viewDidDisappear |
| 画面破棄時     |                 | onDestroy     |                  |

# NavigationMode
AndroidではonCreate/onResumeでイベントが分かれていたり、画面遷移時にstartAcitivty()/startActivityForResult()などを使い分けて、初回表示時と遷移先画面から戻ってきたときの処理を分けたりできるかと思いますが、Windowsではどうやるのか。

ハンドルするイベントは同じになるが、引数の[NavigationEventArgs](https://msdn.microsoft.com/library/windows/apps/br243285)の[NavigationMode](https://msdn.microsoft.com/ja-jp/library/windows/apps/windows.ui.xaml.navigation.navigationeventargs.navigationmode)プロパティで判断できる。

[以下のモード](https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.navigation.navigationmode)がある。
・New
・Back
・Forward
・Refresh


| 操作              | NavigationMode |
|:-----------------|:----------------|
| Frame.Navigate() | New             |
| Frame.GoForward()| Forward         |
| Frame.GoBack()   | Back            |
| バックキー押下    | Back            |
| ？？             | Refresh         |

# NavigationCacheMode
上述したFrame.GoForward()やFrame.GoBack()はフレームの履歴からページ遷移する方法。

```
// GoBack
if (Frame.CanGoBack())
{
    Frame.GoBack();
}

// GoForward
if (Frame.CanGoForward())
{
    Frame.GoForward();
}
```
フレームに履歴を残すにはFrameの[NavigationCacheMode](https://msdn.microsoft.com/ja-jp/library/windows/apps/windows.ui.xaml.navigation.navigationcachemode)プロパティをEnabled or Requiredにする。
遷移前のテキストボックスなどの状態を保持したい場合はこの仕組みを利用する。