在运行时从其他 C# 应用程序 (AutomationProperties.AutomationId) 设置 XAML
本文关键字:AutomationId AutomationProperties 设置 XAML 应用程序 运行时 其他 | 更新日期: 2023-09-27 17:55:45
给定 2 个应用程序:
- 1 个 WPF 应用程序,其中并非所有控件都有 AutomationId,我无法更改。此外,应用程序在运行时添加控件,而无需设置 AutomationId。
- 1 个控制台应用程序,用于自动执行上述 WPF 应用程序
我需要它,因为我想在几乎相同的时间内访问所有元素。(在使用之前搜索自动化元素似乎在时间上有很大差异(从 ms 到 s) - 取决于元素的数量/和树层)
我想在 WPF 运行时期间在控制台应用程序中设置 WPF 控件的自动化 ID。很高兴知道,如果你能想到这个问题的任何解决方案!
到目前为止我尝试过:
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似乎也很有前途,但到目前为止我无法提出解决方案。有人有这方面的经验吗??
IDK 怎么可能,但 WPF 检查器完全能够做我一直在寻找的事情(现在我需要知道它们如何附加到 WPF 应用程序:))。
____OLD ANSWER____更改其他程序的 XAML 似乎是不可能的。如果开发人员"懒得"设置AutomationId,我想出了一个替代解决方案。
自动化应用在开始时循环访问所有控件,为它们提供存储在字典中的唯一名称及其引用。如果在层次结构中添加/删除/更改组件,则会在字典中删除该组件及其后代,并且应用会再次重复此子树。