由于WPF中没有button.PerformClick()
方法,是否可以通过编程方式单击WPF按钮?
WPF在这里采用的方法与WinForms略有不同。它们没有将自动化的对象内置到API中,而是为每个负责自动化的对象都有一个单独的类。在这种情况下,您需要ButtonAutomationPeer
才能完成此任务。
ButtonAutomationPeer peer = new ButtonAutomationPeer(someButton);
IInvokeProvider invokeProv = peer.GetPattern(PatternInterface.Invoke) as IInvokeProvider;
invokeProv.Invoke();
[Here是关于该主题的博客文章。
注意:IInvokeProvider
接口是在UIAutomationProvider
程序集中定义的。
就像JaredPar所说的,您可以参考Josh Smith的文章来阅读自动化。但是,如果您仔细阅读他的文章中的评论,您会发现更优雅的方式来针对WPF控件引发事件]
someButton.RaiseEvent(new RoutedEventArgs(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 });
或使用ToggleButton
this.PowerButton.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
如果您可以访问源代码,则可以通过编程方式“单击”按钮的一种方法是简单地调用按钮的OnClick事件处理程序(或执行与按钮相关联的ICommand,如果您要在更多WPF中执行操作, y方式)。
您为什么要这样做?例如,您是要进行某种自动化测试,还是尝试从不同的代码部分执行与按钮执行的相同操作?
正如Greg D所说,我认为使用MVVM模式单击Automation
的另一种方法(引发点击事件并执行命令)是使用反射来调用OnClick
方法:
typeof(System.Windows.Controls.Primitives.ButtonBase).GetMethod("OnClick", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(button, new object[0]);
当对Button函数使用MVVM命令模式时(推荐做法),触发Button效果的简单方法如下:
someButton.Command.Execute(someButton.CommandParameter);
这将使用按钮触发的Command对象,并传递XAML定义的CommandParameter。