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

问题描述 投票:134回答:7

由于WPF中没有button.PerformClick()方法,是否可以通过编程方式单击WPF按钮?

c# .net wpf button
7个回答
121
投票

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

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

[Here是关于该主题的博客文章。

注意:IInvokeProvider接口是在UIAutomationProvider程序集中定义的。


179
投票

就像JaredPar所说的,您可以参考Josh Smith的文章来阅读自动化。但是,如果您仔细阅读他的文章中的评论,您会发现更优雅的方式来针对WPF控件引发事件]

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

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


29
投票

如果您要呼叫点击事件:

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


20
投票
this.PowerButton.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));

5
投票

如果您可以访问源代码,则可以通过编程方式“单击”按钮的一种方法是简单地调用按钮的OnClick事件处理程序(或执行与按钮相关联的ICommand,如果您要在更多WPF中执行操作, y方式)。

您为什么要这样做?例如,您是要进行某种自动化测试,还是尝试从不同的代码部分执行与按钮执行的相同操作?


4
投票

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

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

1
投票

当对Button函数使用MVVM命令模式时(推荐做法),触发Button效果的简单方法如下:

someButton.Command.Execute(someButton.CommandParameter);

这将使用按钮触发的Command对象,并传递XAML定义的CommandParameter

© www.soinside.com 2019 - 2024. All rights reserved.