WPFにはbutton.PerformClick()
メソッドがないため、プログラムでWPFボタンをクリックする方法はありますか?
WPFは、ここでのWinFormsとは少し異なるアプローチを取ります。 APIに組み込まれたオブジェクトの自動化の代わりに、オブジェクトの自動化を担当するオブジェクトごとに個別のクラスがあります。この場合、このタスクを実行するにはButtonAutomationPeer
が必要です。
ButtonAutomationPeer peer = new ButtonAutomationPeer(someButton);
IInvokeProvider invokeProv = peer.GetPattern(PatternInterface.Invoke) as IInvokeProvider;
invokeProv.Invoke();
ここ は、このテーマに関するブログ投稿です。
注:IInvokeProvider
インターフェイスは、UIAutomationProvider
アセンブリで定義されています。
JaredParが言ったように、自動化に関するJosh Smithの記事を参照できます。ただし、彼の記事へのコメントを見ると、WPFコントロールに対してイベントを発生させるよりエレガントな方法が見つかります。
someButton.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent));
個人的には、自動化ピアではなく上記のものを好みます。
クリックイベントを呼び出す場合:
SomeButton.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
そして、ボタンが押されたように見えるようにしたい場合:
typeof(Button).GetMethod("set_IsPressed", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(SomeButton, new object[] { true });
その後押されていない:
typeof(Button).GetMethod("set_IsPressed", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(SomeButton, new object[] { false });
またはトグルボタンを使用します
this.PowerButton.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
ソースにアクセスできる場合、ボタンをプログラムで「クリック」する1つの方法は、ボタンのOnClickイベントハンドラーを呼び出すことです(または、よりWPF-yの方法で操作している場合は、ボタンに関連付けられたICommandを実行します) )。
なぜあなたはこれをやっている?たとえば、ある種の自動テストを実行していますか、それともボタンがコードの異なるセクションから実行するのと同じアクションを実行しようとしていますか?
Greg D が述べたように、MVVMパターン(クリックイベントが発生し、コマンドが実行される)を使用してボタンをクリックするAutomation
の代替手段は、次を使用してOnClick
メソッドを呼び出すことです反射:
typeof(System.Windows.Controls.Primitives.ButtonBase).GetMethod("OnClick", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(button, new object[0]);
MVVMButton関数のコマンドパターンを使用する場合(推奨プラクティス)、Buttonの効果をトリガーする簡単な方法以下のとおりであります:
someButton.Command.Execute(someButton.CommandParameter);
これは、ボタンがトリガーするCommandオブジェクトを使用し、XAMLで定義されたCommandParameterを渡します。