前の記事はこちら。
Windows8 グリッドアプリケーションを解析する-その1
Windows8 グリッドアプリケーションを解析する-その2
グリッドアプリケーションを作ってView関係のクラス図を作った。
LayoutAwarePage クラス
アプリケーションのビューステートと表示状態のマップ、GoBack、GoForward、GoHome、ナビゲーション用のマウスおよびキーボードのショートカット、ナビゲーションの状態管理およびプロセス継続時間管理、ディクショナリー型ビュー モデル、を実装した各ページの基底クラスである。
コンストラクタ
ディクショナリー型ビュー モデルの初期化、Loaded イベント・Unloaded イベントの作成を行い、Loaded イベントでは StartLayoutUpdates、ナビゲーション用のマウスおよびキーボードのショートカット用のイベントの登録が行われる、Unloaded イベントでは StopLayoutUpdates、ナビゲーション用のマウスおよびキーボードのショートカット用のイベントの削除が行われる。
アプリケーションのビューステートと表示状態のマップ
StartLayoutUpdates Loaded イベントから呼び出されるのでPageでは直接呼び出す必要はない、ページ内のコントロールで必要があればLoaded イベントから呼び出す、ApplicationView.Valueを表示状態とする、初回呼び出しだけSizeChangedイベントの登録を行う。
SizeChangedイベントは InvalidateVisualState を呼ぶ。
StopLayoutUpdates Unloaded イベントから呼び出されるのでPageでは直接呼び出す必要はない、ページ内のコントロールで必要があればUnloaded イベントから呼び出す、StartLayoutUpdates を呼び出した全てのコントロールがStopLayoutUpdatesを呼び出したらSizeChangedイベントの削除を行う。
InvalidateVisualState StartLayoutUpdates を呼び出した全てのコントロールに対しApplicationView.Valueを表示状態として反映する。
GoBack、GoForward、GoHome
Frame に対して GoBack、GoForward、GoHome を実行する。 GoHome は可能な回数分Frame.GoBackを実行して実装される。
ナビゲーション用のマウスおよびキーボードのショートカット
AcceleratorKeyActivated イベントハンドラ
前に戻るキーまたは Alt キーを押しながら左方向キーを押すと前に戻り、次に進むキーまたは Alt キーを押しながら右方向キーを押すと次に進む。
PointerPressed イベントハンドラ
マウスの[戻る] を押すと前に戻り、 [進む] を押すと次に進む。
ナビゲーションの状態管理およびプロセス継続時間管理
OnNavigatedTo
フレームに表示されるときに呼び出される。
1)NavigationEventArgs の NavigationMode が NavigationMode.New の場合、次に進むナビゲーションをクリアする。
2)LoadState を NavigationEventArgs の Parameter と 前のセッションでこのページによって保存された状態のディクショナリ(NavigationMode.New の場合null) をパラメータに呼び出す。
OnNavigatedFrom
フレームに表示されなくなるときに呼び出される。
1)SaveState を 初期化された Dictionary<String, Object> をパラメータに呼び出す。
2)保存された状態のディクショナリに格納する。
LoadState / SaveState
protected virtual の実装になっているのでアプリケーションが中断後に終了しまた表示される場合に復元したいViewModelの情報を登録・復元する必要がある。
ディクショナリー型ビュー モデル
DefaultViewModel IObservableMap<String, Object>型の文字列とバインドするデータが組になった ViewModel である。 Dictionary に変更があったら MapChangedEventHandler<K, V> MapChanged イベントを発行する。INotifyPropertyChanged や INotifyCollectionChanged は発行しないのでバインドするデータ側で用意する必要がある。
次回は各 View の実装について解析する。