2014-02-27 2 views
0

많은 로그 메시지가 포함 된 응용 프로그램 창을 사용하고 있습니다. 나는 그것들을 걸러 내고 그 mathches들만을 검색 할 필요가있다. 그 (것)들을 전부 통과하는 나의 선택은 AutomationElement.GetAll()가 너무 비싸 (메시지의 수천이 있을지도 모른다) 후에 메시지의 가득 차있는 대량을 필터링하는 것과 같이 TreeWalker이다.TreeWalker가 다른 창에서 컨트롤을 트래버스합니다.

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 뷰입니다.

Screenshot from UISpy

예기치 messages 길이는 실제 로그 메시지를 계산하는 것이 크다. 나는 UISpy입니다 추가 자동화 요소에 대한 쿼리와이 요소 (그들은 또한 조건 ControlTypeProperty = ControlType.DataItem 일치) 다른 창에서 검색 한 것을 발견했다. 또한이 창은 다른 응용 프로그램에도 속합니다. TreeWalkerparentDatagrid의 범위에서의 검색을 완료하고 모든 데스크탑 계층 구조를 통과하는 것을 계속했다.

물론 DataGrid의 하위 요소 만 가져 오기를 바랐습니다. 어떤 이상한 일이 발생할 수 있습니까? TreeWalker? 어쩌면 내 코드가 잘못되었지만 동일한 코드를 여러 번 작성했는데 제대로 작동했습니다.

답변

0

TreeWalker가 탐색을 사용하지 않기 때문에 실제로 TreeWalker가 그 이유를 말할 수 없습니다.

물론
List<AutomationElement> messages = new List<AutomationElement>(); 
AutomationElement parentDatagrid;//your AE 

Condition yourCond = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.DataItem)); 
AutomationElementCollection aECollection; 
aECollection= parentDatagrid.FindAll(TreeScope.Element | TreeScope.Descendants, yourCond); 
foreach (AutomationElement element in aECollection) 
{ 
    //whatever you like 
} 

당신이 될 : 난 그냥

나는 내가이 다음을 사용하여 매우 좋은 경험을 가지고, 당신이 말할 수있는 것 등등 부모, 차일, sibilings을 찾고 위해 사용 성능이 문제가되는 경우 TreeScope.Descendants를 조심하십시오. 그런 다음 자손은 직접 하위 항목에서 모든 하위 항목과 하위 항목을 검토하므로 TreeScope.Children을 대신 고려해야합니다.

희망이 도움이됩니다.

+0

답장을 보내 주셔서 감사합니다. TreeWalker는 AutomationElement.FindAll()이 수행 할 때마다 미리로드하지 않고 하나씩 컨트롤을 트래버스 할 수 있으므로 여기에서 탐색에 의도적으로 사용됩니다. – Grade

+0

그냥 확인하십시오 : TreeScope.Descendants 대신 TreeScope.Children으로 시도해 보셨습니까? 0 주위에 (나는 (30 정도) 250 개 요소 주위 전체에 약간의 계층 구조, 예를 들어 응용 프로그램을 테스트, 그리고 TreeScope.Children으로는 훨씬 빨리했다, 각 요소에 대해 주위 0,3-0,6 초 걸렸다 01-0,001) – Hansa

+0

wpf 컨트롤을 자동화하는 경우 다음 [msdn-link] (http://msdn.microsoft.com/en-us/library/ms788741(v=vs.110).aspx)를 읽으십시오. 그렇지 않으면 I 죄송합니다 ... "다음 예제에서는 TreeWalker를 사용하는 목록과 FindAll을 사용하여 목록에서 지정된 항목을 검색하는 두 가지 방법을 보여줍니다 첫 번째 기술은 Win32 컨트롤에서 더 빠른 경향이 있지만 두 번째 방법은 Windows 프레젠테이션 파운데이션 (WPF) 컨트롤. " – Hansa

0

마찬가지로 사용자 정의 TreeWalker을 만들면 앞에서 설명한 것처럼 동작합니다. TreeWalker.ControlViewWalker을 사용하는 것이 더 좋을 수 있으며 검색된 각 요소를 자신의 상태로 점검하십시오.

관련 문제