2

偽のthread.sleepステートメントを使用せずにWPFUIオートメーションを使用しようとしています。私がやりたいのは、コントロールが使用可能になるまで(またはタイムアウトが発生するまで)継続的にポーリングする関数GetElementByIdを用意することです。問題は、親要素の子コントロールをキャッシュしているように見えることです。子供たちにリフレッシュすることは可能ですか?または、誰かが別のアプローチを持っていますか?

public AutomationElement GetElementById(string id, int timeout)
{
    if (timeout <= 1000) throw new ArgumentException("Timeout must be greater than 1000", "timeout");

    AutomationElement element = null;

    int timer = 0;
    const int delay = 100;

    do
    {       
        element = MainWindow.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.AutomationIdProperty, id));                
        Thread.Sleep(delay);
        timer += delay;
    } while (element == null && timer < timeout);

    if (element == null) throw new InvalidOperationException("Unable to find element with id: " + id);

    return element;
}
4

2 に答える 2

0

Thread.Sleepを賢明に使用するよりも良い方法があるとしたら、私はまだそれを見つけていません。

UIAutomationはイベントを提供します。(例としてケースを使用すると)TabItemが選択されたときに発生するイベントをリッスンし、IDでアイテムを検索し続けることができると思います。しかし、この種のパターンは、コードの全体的な読みやすさに大混乱をもたらすと思います。

于 2010-11-05T17:07:55.287 に答える
0

System.Windows.Forms.Application 名前空間で使用できる DoEvents 関数を使用して、実行時間の長いプロセスの発生中に UI を更新できるようにします。これは、WPF 名前空間のメンバーではありません。この記事のように自分で実装するか、System.Windows.Forms 名前空間をインポートして Application.DoEvents を呼び出すことで、似たようなものを使用できます。これにより、ポーリングを行っている間、他の処理を続行できます。注意して使用する機能です。

于 2010-11-05T13:15:39.270 に答える