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 にてコードを追加していきます。
- let buttonEventHandler (eventArgs: System.Windows.RoutedEventArgs) =
- let button = eventArgs.Source :?> System.Windows.Controls.Button
- System.Windows.MessageBox.Show(sprintf "%sからのイベントです" button.Name, "イベントハンドラのテスト")
- |> ignore
- [<EntryPoint; System.STAThread>]
- let main _ =
- let win = new WpfTest.MainWindow()
- win.Button1.Click
- |> Observable.add buttonEventHandler
- let app = new System.Windows.Application()
- 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 イベントには
ビルド、実行するとボタンの付いたウィンドウが表示されます。
ボタンをクリックするとメッセージボックスが表示されます。