如何以编程方式单击WPF中的按钮?

tgh*_*ang 135 .net c# wpf button

由于button.PerformClick()WPF中没有方法,有没有办法以编程方式单击WPF按钮?

Den*_*yka 179

就像JaredPar所说,你可以参考Josh Smith关于自动化的文章.但是,如果您通过对他的文章的评论,您会发现针对WPF控件引发事件的更优雅方式

someButton.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent));
Run Code Online (Sandbox Code Playgroud)

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

  • RaiseEvent解决方案只会引发事件.它不执行与Button关联的命令(如Skanaar所说) (24认同)
  • 如果您使用XAML,例如<Button Name ="X"Click ="X_Click"/>,则按正常方式点击处理程序将捕获该事件.来自我的+1! (4认同)
  • 我正在使用VB ...不确定VB与C#的代码是否不同,但是`new RoutedEventArgs(Button.ClickEvent)`对我来说不起作用.我不得不使用`new RoutedEventArgs(Primitives.ButtonBase.ClickEvent)`.否则,效果很好! (4认同)
  • 要详细说明@EduardoMolteni和Skanaar,你会失去Commands给出的IsEnabled功能,所以除非你希望所有事件都检查它们是否被启用,否则AutomationPeer会更好. (3认同)

Jar*_*Par 122

WPF采用与WinForms略有不同的方法.它们不是将对象的自动化内置到API中,而是为每个负责自动化对象的对象提供单独的类.在这种情况下,您需要ButtonAutomationPeer完成此任务.

ButtonAutomationPeer peer = new ButtonAutomationPeer(someButton);
IInvokeProvider invokeProv = peer.GetPattern(PatternInterface.Invoke) as IInvokeProvider;
invokeProv.Invoke();
Run Code Online (Sandbox Code Playgroud)

是一篇关于这个主题的博客文章.

注意:IInvokeProvider接口在UIAutomationProvider程序集中定义.

  • 倾斜的单行:`((IInvokeProvider)(新的ButtonAutomationPeer(someButton).GetPattern(PatternInterface.Invoke)).Invoke();` (5认同)
  • 谢谢你.我努力在我的应用程序中找到正确的命名空间,直到我添加了对"UIAutomationProvider"的引用.然后不得不添加`using System.Windows.Automation.Peers; 使用System.Windows.Automation.Provider;` (3认同)
  • 需要注意的一点是,Invoke调用是异步的.这意味着如果您在单元测试中使用它,而下一行是检查单击按钮的预期结果,则可能需要等待. (3认同)
  • 光滑,我没有意识到这一点.对自动化测试非常有用.请注意,该链接上有一条评论,建议使用提供的工厂来获取自动化同行,而不是自己创建一个. (2认同)
  • 如果这是一个ToggleButton:button.IsChecekd = false/true; 似乎已经足够了 (2认同)
  • 仅供参考,在“ UIAutomationProvider”程序集中定义了“ IInvokeProvider”接口。 (2认同)

Son*_*orx 31

如果你想调用click事件:

SomeButton.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
Run Code Online (Sandbox Code Playgroud)

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

typeof(Button).GetMethod("set_IsPressed", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(SomeButton, new object[] { true });
Run Code Online (Sandbox Code Playgroud)

之后没下注:

typeof(Button).GetMethod("set_IsPressed", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(SomeButton, new object[] { false });
Run Code Online (Sandbox Code Playgroud)

或使用ToggleButton


小智 20

this.PowerButton.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
Run Code Online (Sandbox Code Playgroud)


Max*_*Max 6

正如Greg D所说,我认为Automation使用 MVVM 模式(引发单击事件并执行命令)单击按钮的另一种方法是使用OnClick反射调用该方法:

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


Gre*_*g D 5

如果您有权访问源,则以编程方式"单击"按钮的一种方法是简单地调用按钮的OnClick事件处理程序(或执行与按钮关联的ICommand,如果您以更多WPF-y方式执行操作).

你为什么做这个?例如,您是在进行某种自动化测试,还是尝试执行按钮从不同代码段执行的相同操作?