2010-11-05 33 views
2

J'essaie d'utiliser WPF UI Automation sans utiliser de fausses instructions thread.sleep. Ce que je voudrais faire est d'avoir une fonction GetElementById qui interroge continuellement jusqu'à ce que le contrôle soit disponible (ou qu'un timeout se produise). Le problème est qu'il semble mettre en cache les contrôles enfants de mon élément parent. Est-il possible de rafraîchir aux enfants? Ou est-ce que quelqu'un a une approche alternative?Comment éviter Thread.Sleep lors de l'utilisation de WPF Automation Framework?

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; 
} 
+0

Plus d'informations. J'essaie d'obtenir un élément qui existe sur un onglet particulier. Si je fais un fil de sommeil après .select de l'onglet alors ça marche. Cependant, si je mets un fil de sommeil dans le cadre de ma méthode, cela ne fonctionne pas. –

Répondre

0

S'il y a une meilleure façon que l'utilisation judicieuse de Thread.Sleep, je ne l'ai pas encore trouvé. UIAutomation fournit Events, et je suppose que vous pourriez (pour utiliser votre cas comme exemple) écouter l'événement qui se produit lorsque TabItem est sélectionné, et seulement ensuite continuer à trouver l'élément par ID. Mais je soupçonne que ce type de modèle pourrait faire des ravages avec la lisibilité globale de votre code.

0

La fonction DoEvents qui est disponible dans l'espace System.Windows.Forms.Application est utilisé pour activer l'interface utilisateur de mettre à jour tout en un long processus en cours d'exécution est INTERVENUES. Ce n'est pas un membre des espaces de noms WPF. Vous pouvez utiliser quelque chose sililar en l'implémentant vous-même comme dans ce article ou en important l'espace de noms System.Windows.Forms et en appelant Application.DoEvents. Cela permettra à votre autre traitement de continuer pendant que vous effectuez votre interrogation. C'est une fonction à utiliser avec prudence.

+0

Malheureusement, cela ne résout pas mon problème. D'autres idées? –