Den*_*yka 179
就像JaredPar所说,你可以参考Josh Smith关于自动化的文章.但是,如果您通过对他的文章的评论,您会发现针对WPF控件引发事件的更优雅方式
someButton.RaiseEvent(new RoutedEventArgs(ButtonBase.ClickEvent));
Run Code Online (Sandbox Code Playgroud)
我个人更喜欢上面的那个而不是自动化同行.
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
程序集中定义.
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)
正如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)
如果您有权访问源,则以编程方式"单击"按钮的一种方法是简单地调用按钮的OnClick事件处理程序(或执行与按钮关联的ICommand,如果您以更多WPF-y方式执行操作).
你为什么做这个?例如,您是在进行某种自动化测试,还是尝试执行按钮从不同代码段执行的相同操作?