F#からWPFのGUIを扱う その1
WPF(Windows Presentation Framework)のウィンドウをF#のコードを使って表示させてみます。XAMLの編集作業の利便性を考えてC#のプロジェクトと連携させることにします。以下の説明で使用している開発環境はVisual Studio 2013 です。
まず準備として新規のソリューションを用意します。C#で「WPFアプリケーション」の項目を選んでプロジェクトを新規作成します。プロジェクト名は何でもいいのですが、ここでは WpfTest としています。
以下の画面のようなC#のプロジェクトが出来上がります。C#やXAMLに関してはデフォルトで生成されるファイルの内容のままにしておきます。特に修正・追加するコードはありません。
メニューバーから、このプロジェクトのプロパティの設定画面を開きます。
アプリケーションの設定画面で出力の種類を「Windowsアプリケーション」から「クラスライブラリ」に変更します。
この段階では以下のようにエラーが出ます。
App.config および App.xaml を削除します。エラーは消えます。
次に、同じソリューション内で F#のプロジェクトを追加で新規作成します。名前は WinAppTest としていったんコンソールアプリケーションの項目を選びます。
以下のようなF#のプロジェクトが追加されます。
プロジェクト WinAppTest をアプリケーションのエントリーポイントとするので「スタートアッププロジェクトに設定」します。
プロジェクト WinAppTest に必要な参照の追加を行います。
先ほど作成したプロジェクト WpfTest を参照マネージャから追加します。
さらに必要な以下のアセンブリ群を追加していきます。
- WindowsBase
- PresentationCore
- PresentationFramework
- System.Xaml
F#のプロジェクト WinAppTest は最終的に以下の画面のような参照設定となります。
ここでプロジェクト WinAppTest のプロパティ設定画面を開きます。
アプリケーションの出力の種類を「コンソールアプリケーション」から「Windowsアプリケーション」に変更します。
F#のプロジェクト WinAppTest のソースファイル Program.fs にウィンドウを表示するためにアプリケーションのエントリーポイントのコードを書いていきます。
単にウィンドウを1つ開くだけのシンプルなコードです。このときC#のプロジェクトには手を加える必要はありません。
- [<EntryPoint; System.STAThread>]
- let main _ =
- let win = new WpfTest.MainWindow()
- let app = new System.Windows.Application()
- app.Run win
3行目でC#のプロジェクト WpfTest 内にある MainWindow クラスを使ってウィンドウオブジェクトを生成しています。Windows フォームアプリケーションとは異なり、ウィンドウは System.Windows.Window クラスの派生クラスです。このコードで使っている MainWindow クラスは、C#のプロジェクト WpfTest を新規作成したときに自動生成されていたクラスです。
4行目で System.Windows.Application クラスを使ってアプリケーションオブジェクトを生成しています。Windows フォームアプリケーションで使うApplication クラスとは名前空間が異なるまったく別のクラスです。クラス名が同じで紛らわしい上に同名の Run メソッドも持っているので注意。
5行目で Run メソッドにウィンドウオブジェクトを渡してWPFアプリケーションを起動させます。
ソリューションをビルド、 実行すると以下のようにWPFのウィンドウが表示されます。