WPFでボタンを押すとメッセージを表示するサンプル

C# コンピュータ
C#

WPFでボタンコントロールを配置しボタンを押すとメッセージボックスでメッセージを表示するサンプルプログラムです。

プロジェクトの作成

dotnet new wpf -n <プロジェクト名>
cd <プロジェクト名>
dotnet add package ReactiveProperty.WPF

ソースコード

ファイル名:MainWindow.xaml

<Window x:Class="SampleButton01.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:interactivity="clr-namespace:Reactive.Bindings.Interactivity;assembly=ReactiveProperty.WPF"
        xmlns:local="clr-namespace:SampleButton01"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.DataContext>
        <local:MainWindowViewModel />
    </Window.DataContext>
    <Grid>
<!-- Buttonのサンプル 開始 -->
        <Button
            x:Name = "Button1"
            Width="200"
            Height="30"
            Content="ボタン1"
            Command="{Binding Button1Command}"
            />
<!-- Buttonのサンプル 終了 -->
    </Grid>
</Window>

ファイル名:MainWindowViewModel.cs

using System.ComponentModel;
using System.Windows;
using Reactive.Bindings;

namespace SampleButton01;

public class MainWindowViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler? PropertyChanged;
    protected virtual void OnPropertyChanged(string name) =>
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    
    // ボタン実行コマンド
    public ReactiveCommand Button1Command {get;} = new();
    
    MainWindowViewModel()
    {
        PropertyChanged += (s, e) => {};

        // ボタン実行コマンドを登録
        Button1Command.Subscribe(()=>Button1Command_Subscribe());
    }
    // ボタン実行コマンドの処理
    void Button1Command_Subscribe()
    {
        MessageBox.Show("ボタンが押されました。");
    }
}//class

実行

dotnet.exe run

ボタンが表示される。

ボタンを押すとメッセージが表示されます。

説明

サンプルプログラムを作るにあたり、動作に必要なコードを全て掲載しつつ、なるべくコンパクトになるように意識しました。dotnet.exeでプロジェクトを作成時、自動的に生成されるスケルトンコードを変更又はソースファイルを追加することで動作するはずです。

ReactivePropertyを使いたいのでパッケージを追加しています。
XAMLのWindowで"xmlns:interactivity="clr-namespace:Reactive.Bindings.Interactivity;assembly=ReactiveProperty.WPF""を追記します。つぎにMainWinViewModel.csでusing Reactive.Bindings;を追記しています。

MainWindowViewModelはINotifyPropertyChangedを継承することが作法になります。(なんとなく継承しなくとも動きそうな?)
継承するとusing System.ComponentModel;が無いとエラーが出ますので追記しておきます。
次にPropertyChangedEventHandlerが無いとエラーが発生しますので定義します。その際初期値がnullになるので?をつけています。
PropertyChangedがnullのままだと気分が良くないので、コンストラクタで初期化していますが{}で特に何もしていません。
初期化はしましたが、PropertyChangedは定義されているが使われていないと警告が出ます。無駄なので削除を促す警告かもしれませんが削除すると動かなくなるので、使うことにします。
protected virtual void OnPropertyChanged(string name) =>...を定義することで、PropertyChangedが使われるように見えるので、警告が出ないようになります。一連のコードはReactiveCommandやReactivePropertyを使う場合不要な感じなのですが、コードを書かないとビルドに失敗しますので書くようにしています。

// ボタン実行コマンド
public ReactiveCommand Button1Command {get;} = new();

ReactiveCommand型のButton1Commandという名前を定義しています。publicですので外部からgetで内容を取得するようにしています。最初に初期化したあと変更する予定がないのでsetは無くてもOKです。ここで言うところ外部は何になるのか、正確には把握していないのですが、XAMLから生成される(C#の?)コードだと考えられまマス。

次にReactiveCommandで処理したいコードを記述することに成ります。

// ボタン実行コマンドを登録
Button1Command.Subscribe(()=>Button1Command_Subscribe());

Subcribeでメソッドを呼び出すように記述しています。メソッドの代わりに{}ブロックを記述しブロック内にコードを記述することも出来ます。コードが短くなるので好んで使っていたのですが、プロジェクトが大きくなるとコンストラクタが肥大化しますので、メソッドに分けるようにしています。

呼び出すメソッドが以下の様になります。動作確認のためにメッセージボックス表示するようにしています。

// ボタン実行コマンドの処理
void Button1Command_Subscribe()
{
    MessageBox.Show("ボタンが押されました。");
}

このようにメソッドにすることによりイベントドリブンで処理を行うコードと同じような構造のコードに成ります。

コメント