在运行时从其他C#应用程序设置XAML属性(AutomationProperties.AutomationId)

时间:2014-04-01 14:55:37

标签: c# wpf xaml ui-automation microsoft-ui-automation

给出2个申请:

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

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

我想在WPF运行时期间在控制台应用程序中设置WPM控件的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。) DependencyObjects DependencyProperties 似乎也很有希望,但到目前为止我还无法提出解决方案。 有人有经验吗?

1 个答案:

答案 0 :(得分:1)

IDK是如何实现的,但WPF Inspector完全可以做我想要的事情(现在我需要知道它们如何附加到WPF应用程序:))。

____ OLD ANSWER____ 似乎无法改变其他程序的XAML。如果开发人员“懒得”设置AutomationId,我会提出另一种解决方案。

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