======================================================
アプリケーション構成
======================================================
典型的な MoNo.RAIL 上のアプリケーションの構造を下図に示します。
.. image:: appstructure.png
MainWindow
======================================================
MainWindow の XAML は次のようなコードとなります。
.. code-block:: xml
:caption: MainWindow.xaml
................ A
...
............. B
......... C
...
...
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 は次のような継承関係で定義されています。
.. code-block:: fsharp
:caption: MoNo.Studio.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`` を継承する場合、次のように構成します。
1. まず編集対象となるデータ型(Document型)を定義します。
2. モデルクラスはこの Document 型をジェネリック引数に指定した ``StudioAppModel`` を継承して定義します。
3. Document をファイルに保存するためのシリアライザを定義します。