2017-01-26 39 views
1

Приложение WPF использует платформу приложений, и я не могу редактировать ни один из них.Получение IUIItem [] для детей CustomUIItem в TestStack.White

я могу посетить каждый элемент в GUI делать что-то вдоль этих линий:

IUIItem[] items = window.GetMultiple(SearchCriteria.All); 
foreach (var item in items) 
{ 
    visit((dynamic)item); 
} 

У меня нет никакой проблемы с нормальным контролем, но я врезался в стену с CustomUIItem.

Я хотел бы посетить всех детей этого, но я не могу сделать из них новый массив IUIItem[].

Вот что я сейчас:

void visit(CustomUIItem item) 
    { 
     AutomationElementCollection children = 
      item 
      .AutomationElement 
      .FindAll(TreeScope.Children, Condition.TrueCondition); 
     UIItemCollection temp = new UIItemCollection(children.Cast<AutomationElement>()); 
     foreach(var t in temp) 
     { 
      visit((dynamic)t); 
     } 
    } 

Somethimes это бросает и большую часть времени сбора остается пустым.

CusomControl имеет «обычные» элементы управления среди своих детей. Я хочу, чтобы они были как обычные IUIItem s.

Где я могу найти документацию для этого. Единственное, что я нашел, это this, и я не могу этого сделать, так как я только посещаю извне, и я не знаю контент управления.

ответ

1

Если я действительно понял вашу проблему.

IUIItem[] items = window.GetMultiple(SearchCriteria.All); 
    foreach (var item in items) 
    { 
     visit(item); 
    } 

меня обновить метод посещения(), он принимает теперь IUItem в качестве аргумента, чтобы позволить посещение нормальных и пользовательских элементов управления.

public void visit(IUIItem item) 
    { 
     if (item is CustomUIItem) 
     { 
      // Process custom controls 
      CustomUIItem customControl = item as CustomUIItem; 

      // Retrieve all the child controls 
      IUIItem[] items = customControl.AsContainer().GetMultiple(SearchCriteria.All); 

      // visit all the children 
      foreach (var t in items) 
      { 
       visit(t); 
      } 
      ... 
     } 
     else 
     { 
      // Process normal controls 
      ... 
     } 
    } 
+0

Вы не использовали ключевое слово (динамическое). Но я думаю, что использование AsContainer - это то, что я искал. – Johannes

+0

Хорошо, я только предположил, что целью метода посещения() было только рекурсивно просматривать дерево UIItems. Теперь я вижу, что ваш реальный метод посещения(), вероятно, более сложный, чем данный код ;-). – DLDR