如何以编程方式点击WPF中的button?

由于WPF中没有button.PerformClick()方法,是否有一种方法来以编程方式单击WPFbutton?

WPF比WinForms在这里采取了一个非常不同的方法。 他们没有内置到API中的对象的自动化,而是为每个对象都有一个单独的类来负责自动化。 在这种情况下,您需要使用ButtonAutomationPeer来完成此任务。

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

这里是关于这个问题的博客文章: http : //joshsmithonwpf.wordpress.com/2007/03/09/how-to-programmatically-click-a-button/

就像JaredPar说过的,你可以参考Josh Smith写给自动化的文章。 不过,如果你看看他的文章的评论,你会发现提高对WPF控件的事件更优雅的方式

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

我个人更喜欢上面的而不是自动化同行。

如果你想打电话点击事件:

 SomeButton.RaiseEvent(new RoutedEventArgs(Button.ClickEvent)); 

如果你想button看起来像被按下:

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

或者使用ToggleButton

 this.PowerButton.RaiseEvent(new RoutedEventArgs(Button.ClickEvent)); 

一种以编程方式“点击”button的方法是,只要调用button的OnClick事件处理程序(或者执行与button相关的ICommand,如果以更多的WPF-y方式进行操作)。

你为什么做这个? 例如,你正在做某种自动化testing,或者试图执行button在另一部分代码中执行的相同操作?

正如Greg D所说,我认为使用MVVM模式(单击事件引发并执行命令)单击button的替代方法是使用reflection调用OnClick方法:

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