多くのログ メッセージを含むアプリケーション ウィンドウで作業しています。それらをフィルタリングして、何らかの条件に一致するものだけを取得する必要があります。それらすべてをトラバースするという私の選択は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
動作の原因は何ですか? 私のコードが間違っているのかもしれませんが、同じ断片を複数回書いたところ、正しく動作しました。