我正在使用包含大量日志消息的应用程序窗口。我需要过滤它们并检索那些只有算数的条件。在TreeWalker
过于昂贵(可能有数千条消息)之后,我选择遍历它们是AutomationElement.GetAll()
,因为过滤了大量的消息。
List<AutomationElement> messages = new List<AutomationElement>();
TreeWalker walker = new TreeWalker(new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.DataItem));
AutomationElement row = walker.GetFirstChild(parentDatagrid);
while (row != null)
{
if (/*some condition*/)
messages.Add(row);
row = walker.GetNextSibling(row);
}
这是我正在测试的控制层次结构的UISpy视图。
意外messages
长度大于实际日志消息的数量。我查询了额外的自动化元素是UISpy,发现这些元素是从另一个窗口检索的(它们也匹配条件ControlTypeProperty = ControlType.DataItem
)。而且,这个窗口甚至属于另一个应用程序。 TreeWalker
在parentDatagrid
范围内完成了搜索,并继续遍历所有桌面层次结构。
当然,我希望只获得datagrid的子元素。什么可能导致这种奇怪的TreeWalker
行为?也许,我的代码是错误的,但我写了相同的剪切多次,并且它工作正常。
答案 0 :(得分:0)
实际上我无法告诉你为什么TreeWalker会这样做,因为我从不使用TreeWalker进行导航。我只是用它来查找父母,孩子,兄弟姐妹等。
我可以告诉你的是,我有很好的使用经验:
List<AutomationElement> messages = new List<AutomationElement>();
AutomationElement parentDatagrid;//your AE
Condition yourCond = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.DataItem));
AutomationElementCollection aECollection;
aECollection= parentDatagrid.FindAll(TreeScope.Element | TreeScope.Descendants, yourCond);
foreach (AutomationElement element in aECollection)
{
//whatever you like
}
当然,如果性能问题,你必须小心使用TreeScope.Descendants。那么你应该考虑使用TreeScope.Children,因为后代会查看直接孩子的所有子元素和子女。
希望这有帮助!