1

我正在使用包含大量日志消息的应用程序窗口。我需要过滤它们并仅检索那些符合某些条件的。我选择遍历它们是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 视图。

UISpy 截图

出乎意料messages的长度大于实际日志消息计数。我查询了额外的自动化元素是 UISpy,发现这个元素是从另一个窗口中检索到的(它们也符合条件ControlTypeProperty = ControlType.DataItem)。而且,这个窗口甚至属于另一个应用程序。TreeWalker完成了它在范围内的搜索parentDatagrid并继续遍历所有桌面层次结构。

当然,我希望只得到datagrid的子元素。什么会导致这种奇怪的TreeWalker行为?也许,我的代码是错误的,但我多次编写相同的片段,并且它工作正常。

4

2 回答 2

1

事实上,我无法告诉你为什么 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 ,因为 Descendants 只查看所有子元素,而 Children 只查看直接子元素。

希望这可以帮助!

于 2014-03-31T14:02:09.377 回答
0

当您像您一样创建 customTreeWalker时,行为将如您所述。最好使用 aTreeWalker.ControlViewWalker然后检查每个检索到的元素是否符合您的条件。

于 2015-09-11T05:55:39.290 回答