C# 按钮,IInvokeProvider并单击

C# 按钮,IInvokeProvider并单击,c#,wpf,events,ui-automation,C#,Wpf,Events,Ui Automation,我只是想弄明白这一点。为什么按钮IInvokeProvider调用click事件而不进行任何显式设置?如果我想自动化另一种方法,如MouseEnter或MouseLeave?是什么让它假设当您调用Invoke()方法时,它应该执行单击事件 这是我的代码: private void Window_Loaded(object sender, RoutedEventArgs e) { ButtonAutomationPeer buttonPeer = new ButtonAutomationP

我只是想弄明白这一点。为什么按钮
IInvokeProvider
调用click事件而不进行任何显式设置?如果我想自动化另一种方法,如
MouseEnter
MouseLeave
?是什么让它假设当您调用
Invoke()
方法时,它应该执行
单击事件

这是我的代码:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    ButtonAutomationPeer buttonPeer = new ButtonAutomationPeer(button);
    IInvokeProvider invokeProvider = buttonPeer.GetPattern(PatternInterface.Invoke) as IInvokeProvider;
    invokeProvider.Invoke(); // this triggers button_Click handler
}

private void button_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Button clicked!");
}

谢谢

IInvokeProvider接口是System.Windows.Automation命名空间系列的一部分,也称为WUIA(Windows用户界面自动化)。WUIA旨在支持可访问性客户端(屏幕阅读器等)以支持例如盲人用户。IInvokeProvider.Invoke()方法正在调用实现UI元素的默认操作。在您的情况下,按钮上的默认操作是单击事件


您必须使用不同的接口调用鼠标事件。

Yup-ButtonAutomationPeer确实是自动化/可访问性的支持类(注意,除了可访问性之外,它还用于自动化测试或语音命令)。如果要编写自己的自定义按钮类而不是基于现有按钮类,则需要提供自己的MyButtonPeer来实现此接口,以便这些工具有一种标准的方式来“按下”按钮这里的Invoke表示任何类似于命令的东西,所以按钮和菜单项都实现了它。哦,我不知道那些默认操作。我将在线搜索以查看每个控件的默认操作。谢谢你的信息!不确定这里“任何显式设置”是什么意思-您希望发生什么?正如我提到的,如果我想自动化另一个事件,该怎么办?UIAutomation是为一种特定类型的交互而设计的-在比输入更高的级别与UI元素交互。因此,当用鼠标单击按钮时,按钮会被按下并发出命令,而单击列表项时,UIAutomation会将其视为两件不同的事情,即使它们都是鼠标单击的结果:一个是发出命令(IInvokeProvider),另一个是更改选择状态(ISelectionItemProvider)。如果希望在鼠标输入级别工作,那么SendInput可能比UIA更合适。