Getting a Good Grasp of F# (仮)

関数型言語F#をもっと楽しみたい

WPF で NumericUpDown コントロールを使う その2 [F#編]

前回 C# で実装した機能を今記事では F# で実装してみます。前回書いた XAML コードを(文字列としてですが)再利用します。

F# での実装

F# でプロジェクトの作成

F#の新規プロジェクトを作成するためにまず「コンソールアプリケーション(.NET Framework)」を選択します。プロジェクト名は任意で構いません(本記事では「 WPF_SpinFs 」としています)。

WPF アプリケーションとして作成するので「プロジェクトのプロパティ」の設定画面で「出力の種類」を「Windowsアプリケーション」に変更します。

 アセンブリ参照の追加

WPF を利用するために必要なアセンブリ参照を追加します。

  • WindowsBase
  • PresentationCore
  • PresentationFramework
  • System.Xaml

WinForms に属するコントロールを使うため、必要なアセンブリ参照を追加します。

  • System.Windows.Forms
  • WindowsFormsIntegration

 今記事では XAMLXMLドキュメントとして処理するため以下のアセンブリ参照を追加します。

 プロジェクトが参照するアセンブリ一覧は以下のようになります。

F# のソースコード

前回用いた XAML コードをコピー&ペーストして流用しています。ただし C# のプロジェクトで使っていた XAML をそのまま F# で XamlReader によって読み込こむことはできません。前処理として、 XAML コードを XML 文書として読み込み、動的に不要な情報を削除し必要な情報を追加しています。 

15~38行目前回 C#のプロジェクトで用いた XAML コードを過不足なくコピー&ペーストしただけの部分です。C# にはない文法ですが、文字列の前後を3連続するダブルクオート( """ )で囲んでいます。エスケープシーケンスを使うことなく文字列内にダブルクオート( " )を置くことができ、また複数行に渡る文字列を扱えます。

手作業で F# 向けに XAML の内容を修正してもよいのですが、今記事では後で適正な XAML の形へ動的に変更を加えることにします。

44行目XElement クラス (System.Xml.Linq) を使って XAML コードを XMLとして読み込んでいます。

46~48行目XAML のルート要素の x:Class 属性(C# のコードビハインドのクラス名)を探し出して削除しています。

50~53行目XAML のルート要素に名前空間を追加し、XAML から名前空間 System.Windows.Forms.Integration への参照を可能にします。

C# では XName 型と string 型の間の暗黙の型変換が行われるのですが F# ではこの暗黙の型変換が機能しないので XName.Get メソッドを用いて明示的な型変換を行っています。

55行目:(前処理の済んだ) XElement オブジェクトが保持する XML ドキュメントを  XamlReader が XAML 文字列として読み込んで WPF の Window オブジェクトに変換しています。

実行結果

前回C# のコードと同じ振る舞いを実現できました。