アプリケーション構成¶
典型的な MoNo.RAIL 上のアプリケーションの構造を下図に示します。
MainWindow¶
MainWindow の XAML は次のようなコードとなります。
<Window ...
xmlns:m="http://rail.monocommunity.com">
<Window.DataContext>
<AppContext/> ................ A
</Window.DataContext>
...
<m:StudioViewport> ............. B
<m:StudioSceneGraph> ......... C
...
</m:StudioSceneGraph>
</m:StudioViewport>
...
</Window>
A のようにビューモデルとして DataContext プロパティに AppContext を設定します。 ここには明示されていませんが、例えば AppContext に定義したコマンドを Data Binding によってビューと関連付ける、といった WPF/MVVM のパターンに則ってプログラミングします。
B のように、ウィンドウに3Dビューを埋め込むことができます。
この例では MoNo.Studio.StudioViewport
を埋め込んでいますが、代わりに MoNo.Wpf.GLViewport
を埋め込むことも可能です。
StudioViewport
には予めよく利用される典型的な機能(ビュー操作のボタンやルーラー、座標軸の描画、等)が載せられているので便利ですが、それらの機能が不要な場合(取り除きたい場合)には MoNo.Wpf.GLViewport
を直接利用してください。
C では、3Dビューの描画対象とするシーングラフを設定しています。
ここでは MoNo.Studio.StudioSceneGraph
を埋め込んでいますが、このクラスはビューモデルが MoNo.Studio.StudioAppContext
を継承していることを前提としています。この前提が成り立たない場合には、代わりに MoNo.Wpf.SceneGraph
を使用します。
ビューモデル¶
典型的には MoNo.Studio.StudioAppContext を継承してメインのビューモデルを定義します。 StudioAppContext は次のような継承関係で定義されています。
type StudioAppContext () =
inherit Wpf.ApplicationContext ()
...
type StudioAppContext<'app when 'app :> StudioAppModelBase> (...) =
inherit StudioAppContext ()
...
このように StudioAppContext
には非ジェネリック版とジェネリック引数 'app
を持つものがあります。
モデルクラスが StudioAppModelBase
を継承している場合には後者を、そうでない場合には前者を使用してください。
直接 MoNo.Wpf.ApplicationContext
を継承してビューモデルを定義することも出来ますが、その必要が生じるケースはあまりないと考えられます。
モデル¶
冒頭の図では AppModel
クラスは MoNo.Studio.StudioAppModel
を継承しています。
しかしこの継承は必ずしも必要ではなく、アプリケーションによっては何も継承せずにモデルクラスを定義するほうが適切な場合もあります。
StudioAppModel
の継承が推奨されるケースは次のようなアプリケーションです:
- アプリケーションが編集対象のデータ(ドキュメント)を持つ。
- のデータをファイルに保存したりファイルから開いたりしたい。
例えばビューアの場合には StudioAppModel
の継承は不適切です。この場合、必要なデータの閲覧のみで編集操作がありませんので上記の条件に該当しません。
StudioAppModel
を継承する場合、次のように構成します。
- まず編集対象となるデータ型(Document型)を定義します。
- モデルクラスはこの Document 型をジェネリック引数に指定した
StudioAppModel<Document>
を継承して定義します。 - Document をファイルに保存するためのシリアライザを定義します。