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

0

カスタムを作成するとTreeWalker、あなたがしたように、動作はあなたが述べたとおりになります。TreeWalker.ControlViewWalkerを使用して、取得した各要素の条件を確認する方がよい場合があります。

于 2015-09-11T05:55:39.290 に答える