えムナウ Blog

えムナウ の なすがまま

目次

Blog 利用状況

ニュース


follow mnow at http://twitter.com


えムナウのプログラミングのページ

INETAJ

書庫

日記カテゴリ

ギャラリ

2013年1月12日 #

Windows8 グリッドアプリケーションを解析する-その3

前の記事はこちら。

Windows8 グリッドアプリケーションを解析する-その1

Windows8 グリッドアプリケーションを解析する-その2

 

グリッドアプリケーションを作ってView関係のクラス図を作った。

ViewClasses

 

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 の実装について解析する。

posted @ 22:39 | Feedback (2)