Getting a Good Grasp of F# (仮)

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

F#からWPFのGUIを扱う その2

WPFボタンの簡単なClickイベント処理を試みます。前回作成したソリューションにコードを追加していきます。

 C#のプロジェクト WpfTest にて MainWindow.xaml にボタンを追加します。XAMLデザイナーの画面でマウス操作でボタンを配置してみます。

ツールボックスから「ボタン」の項目をドラッグ&ドロップすればボタンの追加がXAMLコードに反映されます。配置する位置や大きさは任意で構いません。

 

その後でXAMLコードに直接テキストでボタンのプロパティを追加していきます。
ここでは以下の2つのプロパティの記述を追加しています。

  • x:Name="Button1"
  • x:FieldModifier="public"

変更後の MainWindow.xaml は以下のようになります。

<Window x:Class="WpfTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button x:Name="Button1" x:FieldModifier="public" Content="Button" HorizontalAlignment="Left" Margin="63,56,0,0" VerticalAlignment="Top" Width="75"/>
    </Grid>
</Window>

プロジェクト WpfTest をいったんビルドします。

 

次に F# のプロジェクト WinAppTest のファイル Program.fs にてコードを追加していきます。

  1. let buttonEventHandler (eventArgs: System.Windows.RoutedEventArgs) =
  2.     let button = eventArgs.Source :?> System.Windows.Controls.Button
  3.     System.Windows.MessageBox.Show(sprintf "%sからのイベントです" button.Name, "イベントハンドラのテスト")
  4.     |> ignore   
  5.  
  6. [<EntryPoint; System.STAThread>]
  7. let main _ =
  8.     let win = new WpfTest.MainWindow()
  9.     win.Button1.Click
  10.     |> Observable.add buttonEventHandler
  11.      
  12.     let app = new System.Windows.Application()
  13.     app.Run win

 1~4行目の関数 buttonEventHandler はボタンクリック時のイベントハンドラに使う関数です。シグネチャSystem.Windows.RoutedEventArgs -> unit です。
2行目System.Windows.Controls.Button型にキャストしてイベントソースの Button オブジェクトのプロパティにアクセスできるようにしています。
3行目でメッセージボックスを表示させています。Button オブジェクトの Name プロパティ(XAMLコードで「 x:Name="Button1" 」と記述した部分)の情報を表示させます。

 9~10行目はボタンの Click イベントに関数 buttonEventHandler イベントハンドラとして登録しています。Buttonオブジェクトへのアクセスですが、予めXAMLコードで「 x:Name="Button1" 」と明示的に名前(Name プロパティ)を指定しておいたので Button1 という名前でアクセス出来ます。
WPFのボタンの Click イベントには Observable.add メソッドを使ってイベントハンドラの登録が出来ます。

ビルド、実行するとボタンの付いたウィンドウが表示されます。

ボタンをクリックするとメッセージボックスが表示されます。