MS UI Automation- AddAutomationHandler 未触发
MS UI Automation- AddAutomationHandler not firing
我正在使用 Microsoft 的 UI 自动化工具将更改处理程序添加到文本框。代码如下:
// Get a reference to the textbox.
var textbox = window.FindFirst(
TreeScope.Descendants,
new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit)
);
// Bind a property change handler to the textbox -- this works great
Automation.AddAutomationPropertyChangedEventHandler(
textbox,
TreeScope.Element,
(o, e) => { Console.WriteLine("Textbox value property event"); },
ValuePattern.ValueProperty
);
//A different way of binding - why doesn't this fire?
Automation.AddAutomationEventHandler(
TextPatternIdentifiers.TextChangedEvent, // is this the right event?
textbox,
TreeScope.Element,
(o, e) => { Console.WriteLine("Text Changed Event (I want this to fire please)"); }
);
每当更改文本框时,Automation.AddAutomationPropertyChangedEventHandler
添加的事件处理程序都会正常触发,但 Automation.AddAutomationEventHandler
添加的事件处理程序不会触发。
我必须在这里监听不同类型的事件吗?那应该是哪个事件?
您是否已使用 AccEvent SDK 工具验证 UI 正在引发 TextChanged 事件?例如,我只是 运行 AccEvent,并将其设置为报告记事本引发的 TextChanged 事件。下图显示在我键入时正在引发事件。当您在正在使用的 UI 中键入时,看看 AccEvent 是否报告事件会很有趣。如果没有引发事件,则不会调用您的处理程序。
谢谢,
家伙
AccEvent 工具确实非常有用。从可用性的角度来看,它当然还有改进的空间,但即便如此,它仍然可以帮助您准确了解 UIA 事件是由 UI 引发的。这包括帮助您了解 UI 在您预期会引发事件时未引发哪些事件。正如您所指出的,Button 在被调用时可能不会引发 Invoked 事件,这对您来说很尴尬。不幸的是,我认为没有很好的答案来解释为什么某些事件没有被引发。理想情况下,UI 控件使用的 UI 框架将引发所有适当的事件。例如,我只是将 AccEvent 指向 运行 dlg 上的确定按钮,并调用了该按钮。下面的屏幕截图向我展示了当我这样做时引发了 Invoked 事件。
我敢打赌,编写 运行 dlg 的人并没有明确地为引发该事件做任何工作,所以平台的某些部分正在为 dlg 做这件事。
附带说明一下,记住通常在调用按钮时,按钮会立即消失(就像 运行 dlg 上的“确定”按钮的情况一样)是很有用的。因此,如果您收到 Invoked 事件,然后尝试返回到引发该事件的元素以获取有关该元素的更多详细信息,那么如果该元素不再存在,这将失败。请求在事件引发时将有关元素的数据与事件缓存在一起会很有帮助。
类似地,如果我将 AccEvent 指向 XAML 应用程序中的按钮,当我单击该按钮时会引发 Invoked 事件,如下所示。
但是如果 UI 框架(或某些看起来像按钮的自定义 UI)在按钮被调用时没有引发 Invoked 事件,您将无能为力要做以引发事件。 UIA 只是将数据和事件从 UI 传送到您的客户端代码,而 UI 可能不会引发事件。在这种情况下,我发现查看在我感兴趣的特定场景中引发了哪些事件可能会很有趣。虽然我真正想要的事件可能不会引发,但也许还有其他我可以做出反应的事件到,还是要实现我的目标。
谢谢,
家伙
对于 你的 问题:
我发现当 element.GetRuntimeId()
长度为 0
时,它不会触发,这就是为什么 AddAutomationEventHandler
不适用于 element
.
希望对你有所帮助
我正在使用 Microsoft 的 UI 自动化工具将更改处理程序添加到文本框。代码如下:
// Get a reference to the textbox.
var textbox = window.FindFirst(
TreeScope.Descendants,
new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit)
);
// Bind a property change handler to the textbox -- this works great
Automation.AddAutomationPropertyChangedEventHandler(
textbox,
TreeScope.Element,
(o, e) => { Console.WriteLine("Textbox value property event"); },
ValuePattern.ValueProperty
);
//A different way of binding - why doesn't this fire?
Automation.AddAutomationEventHandler(
TextPatternIdentifiers.TextChangedEvent, // is this the right event?
textbox,
TreeScope.Element,
(o, e) => { Console.WriteLine("Text Changed Event (I want this to fire please)"); }
);
每当更改文本框时,Automation.AddAutomationPropertyChangedEventHandler
添加的事件处理程序都会正常触发,但 Automation.AddAutomationEventHandler
添加的事件处理程序不会触发。
我必须在这里监听不同类型的事件吗?那应该是哪个事件?
您是否已使用 AccEvent SDK 工具验证 UI 正在引发 TextChanged 事件?例如,我只是 运行 AccEvent,并将其设置为报告记事本引发的 TextChanged 事件。下图显示在我键入时正在引发事件。当您在正在使用的 UI 中键入时,看看 AccEvent 是否报告事件会很有趣。如果没有引发事件,则不会调用您的处理程序。
谢谢,
家伙
AccEvent 工具确实非常有用。从可用性的角度来看,它当然还有改进的空间,但即便如此,它仍然可以帮助您准确了解 UIA 事件是由 UI 引发的。这包括帮助您了解 UI 在您预期会引发事件时未引发哪些事件。正如您所指出的,Button 在被调用时可能不会引发 Invoked 事件,这对您来说很尴尬。不幸的是,我认为没有很好的答案来解释为什么某些事件没有被引发。理想情况下,UI 控件使用的 UI 框架将引发所有适当的事件。例如,我只是将 AccEvent 指向 运行 dlg 上的确定按钮,并调用了该按钮。下面的屏幕截图向我展示了当我这样做时引发了 Invoked 事件。
我敢打赌,编写 运行 dlg 的人并没有明确地为引发该事件做任何工作,所以平台的某些部分正在为 dlg 做这件事。
附带说明一下,记住通常在调用按钮时,按钮会立即消失(就像 运行 dlg 上的“确定”按钮的情况一样)是很有用的。因此,如果您收到 Invoked 事件,然后尝试返回到引发该事件的元素以获取有关该元素的更多详细信息,那么如果该元素不再存在,这将失败。请求在事件引发时将有关元素的数据与事件缓存在一起会很有帮助。
类似地,如果我将 AccEvent 指向 XAML 应用程序中的按钮,当我单击该按钮时会引发 Invoked 事件,如下所示。
但是如果 UI 框架(或某些看起来像按钮的自定义 UI)在按钮被调用时没有引发 Invoked 事件,您将无能为力要做以引发事件。 UIA 只是将数据和事件从 UI 传送到您的客户端代码,而 UI 可能不会引发事件。在这种情况下,我发现查看在我感兴趣的特定场景中引发了哪些事件可能会很有趣。虽然我真正想要的事件可能不会引发,但也许还有其他我可以做出反应的事件到,还是要实现我的目标。
谢谢,
家伙
对于 你的 问题:
我发现当 element.GetRuntimeId()
长度为 0
时,它不会触发,这就是为什么 AddAutomationEventHandler
不适用于 element
.
希望对你有所帮助