読者です 読者をやめる 読者になる 読者になる

xin9le.net

Microsoft の製品/技術が大好きな Microsoft MVP な管理人の技術ブログです。

ボタンをプログラム側からクリックする

クライアントアプリケーションを作成していると、稀に「ボタンをクリックしたことにしたい」場合があります。ボタンのイベントハンドラやコマンドを直接呼び出すのもありかもしれませんが、何か気持ち悪い感じがしないでもないのでクリックを模倣してみましょう。

Windows Formの場合

Windows Formの場合は非常に簡単で、最初からクリックを模倣するためのPerformClickというメソッドが用意されています。対象となるボタンに対して呼び出してやるだけなので非常にお手軽です。以下のコードだと、ボタン1をクリックしてもボタン2をクリックしてもメッセージボックスが表示されます。

private void button1_Click(object sender, EventArgs e)
{
    MessageBox.Show("button1 Clicked");
}

private void button2_Click(object sender, EventArgs e)
{
    this.button1.PerformClick();  //--- ボタン1を押したことにする
}

WPFの場合

ではWPFだとどうか。大変に残念なことにPerformClickのような便利なメソッドは用意されていないので、自分で作るしかありません。WPFの場合は以下のようにButtonAutomationPeerを使って実現します。

using System;
using System.Windows.Automation.Peers;
using System.Windows.Automation.Provider;
using System.Windows.Controls;

namespace WpfApplication
{
    public static class ButtonExtensions
    {
        public static void PerformClick(this Button button)
        {
            if (button == null)
                throw new ArgumentNullException("button");

            var provider = new ButtonAutomationPeer(button) as IInvokeProvider;
            provider.Invoke();
        }
    }
}

途中IInvokeProviderインターフェースを利用していますが、これを利用するにはUIAutomationProvider.dllの参照が必要です。参照設定の追加だけ注意してください。使い方はWindows Formのときと同じです。ほんの少しめんどくさいですが、ライブラリ化してしまえばもう困らないでしょう。