web-dev-qa-db-ja.com

プログラムでWPFのボタンをクリックする方法は?

WPFにはbutton.PerformClick()メソッドがないため、プログラムでWPFボタンをクリックする方法はありますか?

134
tghoang

WPFは、ここでのWinFormsとは少し異なるアプローチを取ります。 APIに組み込まれたオブジェクトの自動化の代わりに、オブジェクトの自動化を担当するオブジェクトごとに個別のクラスがあります。この場合、このタスクを実行するにはButtonAutomationPeerが必要です。

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

ここ は、このテーマに関するブログ投稿です。

注:IInvokeProviderインターフェイスは、UIAutomationProviderアセンブリで定義されています。

121
JaredPar

JaredParが言ったように、自動化に関するJosh Smithの記事を参照できます。ただし、彼の記事へのコメントを見ると、WPFコントロールに対してイベントを発生させるよりエレガントな方法が見つかります。

someButton.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent));

個人的には、自動化ピアではなく上記のものを好みます。

179
Denis Vuyka

クリックイベントを呼び出す場合:

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 });

またはトグルボタンを使用します

29
Sonorx
this.PowerButton.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
20
Mahdi

ソースにアクセスできる場合、ボタンをプログラムで「クリック」する1つの方法は、ボタンのOnClickイベントハンドラーを呼び出すことです(または、よりWPF-yの方法で操作している場合は、ボタンに関連付けられたICommandを実行します) )。

なぜあなたはこれをやっている?たとえば、ある種の自動テストを実行していますか、それともボタンがコードの異なるセクションから実行するのと同じアクションを実行しようとしていますか?

5
Greg D

Greg D が述べたように、MVVMパターン(クリックイベントが発生し、コマンドが実行される)を使用してボタンをクリックするAutomationの代替手段は、次を使用してOnClickメソッドを呼び出すことです反射:

typeof(System.Windows.Controls.Primitives.ButtonBase).GetMethod("OnClick", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(button, new object[0]);
4
Max

MVVMButton関数のコマンドパターンを使用する場合(推奨プラクティス)、Buttonの効果をトリガーする簡単な方法以下のとおりであります:

someButton.Command.Execute(someButton.CommandParameter);

これは、ボタンがトリガーするCommandオブジェクトを使用し、XAMLで定義されたCommandParameterを渡します。

1
KVKConsultancy