如何以编程方式点击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]);