回答:
ここでは、WPFはWinFormsとは少し異なるアプローチを取ります。オブジェクトの自動化をAPIに組み込む代わりに、オブジェクトの自動化を担当するオブジェクトごとに個別のクラスがあります。この場合、ButtonAutomationPeer
このタスクを実行するにはが必要です。
ButtonAutomationPeer peer = new ButtonAutomationPeer(someButton);
IInvokeProvider invokeProv = peer.GetPattern(PatternInterface.Invoke) as IInvokeProvider;
invokeProv.Invoke();
これはこの件に関するブログ投稿です。
注:IInvokeProvider
インターフェースはUIAutomationProvider
アセンブリーで定義されます。
UIAutomationProvider
。その後、追加する必要がありましたusing System.Windows.Automation.Peers; using System.Windows.Automation.Provider;
((IInvokeProvider) (new ButtonAutomationPeer(someButton).GetPattern(PatternInterface.Invoke)).Invoke();
IInvokeProvider
インターフェースはUIAutomationProvider
アセンブリで定義されています。
JaredParが言ったように、オートメーションに関するJosh Smithの記事を参照できます。ただし、彼の記事へのコメントを見ると、WPFコントロールに対してイベントを発生させるよりエレガントな方法が見つかります。
someButton.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent));
私は個人的には、自動化ピアよりも上記のものを好みます。
new RoutedEventArgs(Button.ClickEvent)
ませんでした。私は使用しなければなりませんでしたnew RoutedEventArgs(Primitives.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 });
またはトグルボタンを使用する
ソースにアクセスできる場合、ボタンをプログラムで「クリック」する1つの方法は、ボタンのOnClickイベントハンドラーを呼び出す(または、ボタンに関連付けられたICommandを実行する)ことです。 )。
なぜあなたはこれをやっている?たとえば、ある種の自動テストを行っていますか、それとも、ボタンがコードの別のセクションから実行するのと同じアクションを実行しようとしていますか?
グレッグDが言った、私がする別のことを考えてAutomation
(クリックイベントが発生し、コマンドが実行された)MVVMパターンを使用して、ボタンをクリックすることで呼び出すことですOnClick
:リフレクションを使用する方法を
typeof(System.Windows.Controls.Primitives.ButtonBase).GetMethod("OnClick", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(button, new object[0]);
ボタン機能にMVVMコマンドパターンを使用する場合(推奨される方法)、ボタンの効果をトリガーする簡単な方法は次のとおりです。
someButton.Command.Execute(someButton.CommandParameter);
これは、ボタンがトリガーするCommandオブジェクトを使用し、XAMLで定義されたCommandParameterを渡します。
オートメーションAPIソリューションの問題は、UIAutomationProvider
プロジェクト/パッケージの依存関係としてフレームワークアセンブリへの参照が必要なことです。
別の方法は、動作をエミュレートすることです。以下に、拡張メソッドとして実装された、バインドされたコマンドでMVVMパターンを検討する拡張ソリューションがあります。
public static class ButtonExtensions
{
/// <summary>
/// Performs a click on the button.<br/>
/// This is the WPF-equivalent of the Windows Forms method "<see cref="M:System.Windows.Forms.Button.PerformClick" />".
/// <para>This simulates the same behaviours as the button was clicked by the user by keyboard or mouse:<br />
/// 1. The raising the ClickEvent.<br />
/// 2.1. Checking that the bound command can be executed, calling <see cref="ICommand.CanExecute" />, if a command is bound.<br />
/// 2.2. If command can be executed, then the <see cref="ICommand.Execute(object)" /> will be called and the optional bound parameter is p
/// </para>
/// </summary>
/// <param name="sourceButton">The source button.</param>
/// <exception cref="ArgumentNullException">sourceButton</exception>
public static void PerformClick(this Button sourceButton)
{
// Check parameters
if (sourceButton == null)
throw new ArgumentNullException(nameof(sourceButton));
// 1.) Raise the Click-event
sourceButton.RaiseEvent(new RoutedEventArgs(System.Windows.Controls.Primitives.ButtonBase.ClickEvent));
// 2.) Execute the command, if bound and can be executed
ICommand boundCommand = sourceButton.Command;
if (boundCommand != null)
{
object parameter = sourceButton.CommandParameter;
if (boundCommand.CanExecute(parameter) == true)
boundCommand.Execute(parameter);
}
}
}