我正在使用包含大量日志消息的应用程序窗口。我需要过滤它们并仅检索那些符合某些条件的。我选择遍历它们是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
行为?也许,我的代码是错误的,但我多次编写相同的片段,并且它工作正常。