アプリケーション構成

典型的な MoNo.RAIL 上のアプリケーションの構造を下図に示します。

../../_images/appstructure.png

MainWindow

MainWindow の XAML は次のようなコードとなります。

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 は次のような継承関係で定義されています。

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<Document> を継承して定義します。
  3. Document をファイルに保存するためのシリアライザを定義します。