1

给定2个应用程序:

  • 1 WPF应用程序,并非所有控件都有 AutomationId,我无法更改。此外,应用程序在运行时添加控件而不设置 AutomationId。
  • 1 个自动执行上述 WPF 应用程序的控制台应用程序

我需要它,因为我想在几乎相同的时间内访问所有元素。(在使用之前搜索自动化元素的时间似乎有很大不同(从毫秒到秒) - 取决于元素/和树层的数量)

我想在 WPF 运行时在控制台应用程序中设置 WPF 控件的 AutomationIds。很高兴知道,如果你能想到任何解决这个问题的方法!


我到目前为止所尝试的:

1.) 反思

Type type = element.GetType();
FieldInfo fi = type.GetField("AutomationIdProperty");
fi.SetValue(element, "x"); //Error

错误消息:“'System.String' 类型的对象无法转换为'System.Windows.Automation.AutomationProperty' 类型”但我想交出一个值,而不是属性类型......

如果我改用以下内容,则不会引发错误,但不会更改 XAML

fi.SetValue(element, AutomationElement.AutomationIdProperty); 

2.)直接

AutomationElement element; // = my AutomationElement 
element.Current.AutomationId = "x"; //since AutomationId is Readonly - its not possible

3.) DependencyObjectsDependencyProperties似乎也很有希望,但到目前为止我还没有提出解决方案。有人有这方面的经验吗??

4

1 回答 1

1

IDK 怎么可能,但WPF Inspector完全能够做我正在寻找的事情(现在我需要知道它们如何附加到 WPF 应用程序:))。

____OLD ANSWER____ 更改其他程序的 XAML 似乎是不可能的。如果开发人员“懒得”设置 AutomationId,我想出了一个替代解决方案。

自动化应用程序在开始时迭代所有控件,为它们提供唯一的名称,这些名称连同它们的引用一起存储在字典中。如果组件在层次结构中被添加/删除/更改,组件及其后代会在字典中被删除,并且应用程序会再次在此子树上重新迭代。

于 2014-04-04T07:30:49.717 回答