tmytのらくがき

個人の日記レベルです

ボタンのクリックをエミュレートする

Win32だったらSendMessage(hWnd, BM_CLICK, 0, 0); とかやれば一瞬ですむ話をWinRTでやると結構めんどくさかった。というはなし。

こんなコードを書くと、コードからボタンのクリックをエミュレートできます。

var peer = new ButtonAutomationPeer(button);
var invokeProv = peer.GetPattern(PatternInterface.Invoke) as IInvokeProvider;
invokeProv.Invoke();

簡単ですね!ちなみに、Windows.UI.Xaml.Automation.Peers 空間には他の機能もいっぱいあるので一度見てみるといいかも。

このあたりのクラスはUI Automationというもので、本来であればUIの自動テストに使ったりするものです。UIのテストをするには、ボタンを押したり、アプリバーを出したり引っ込めたり…etc, etc... しないといけないので、それらの機能がコードからエミュレーション出来るというわけです。

Clickイベントのイベントハンドラを直接叩いてもいいんですが、どうしてもボタンをクリックしたという事実が必要な場合にどうぞ。

ちなみに普段はこんな拡張メソッドを作ってます。

public static class ButtonExtension
{
    public static void RaiseClick(this Button button)
    {
        var peer = new ButtonAutomationPeer(button);
        var invokeProv = peer.GetPattern(PatternInterface.Invoke) as IInvokeProvider;
        invokeProv.Invoke();
    }
}

これを使うと、こんな感じでボタンがクリックできます。

button1.RaiseClick();

ちょっと便利?