많은 로그 메시지가 포함 된 응용 프로그램 창을 사용하고 있습니다. 나는 그것들을 걸러 내고 그 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 뷰입니다.
예기치 messages
길이는 실제 로그 메시지를 계산하는 것이 크다. 나는 UISpy입니다 추가 자동화 요소에 대한 쿼리와이 요소 (그들은 또한 조건 ControlTypeProperty = ControlType.DataItem
일치) 다른 창에서 검색 한 것을 발견했다. 또한이 창은 다른 응용 프로그램에도 속합니다. TreeWalker
는 parentDatagrid
의 범위에서의 검색을 완료하고 모든 데스크탑 계층 구조를 통과하는 것을 계속했다.
물론 DataGrid의 하위 요소 만 가져 오기를 바랐습니다. 어떤 이상한 일이 발생할 수 있습니까? TreeWalker
? 어쩌면 내 코드가 잘못되었지만 동일한 코드를 여러 번 작성했는데 제대로 작동했습니다.
답장을 보내 주셔서 감사합니다. TreeWalker는 AutomationElement.FindAll()이 수행 할 때마다 미리로드하지 않고 하나씩 컨트롤을 트래버스 할 수 있으므로 여기에서 탐색에 의도적으로 사용됩니다. – Grade
그냥 확인하십시오 : TreeScope.Descendants 대신 TreeScope.Children으로 시도해 보셨습니까? 0 주위에 (나는 (30 정도) 250 개 요소 주위 전체에 약간의 계층 구조, 예를 들어 응용 프로그램을 테스트, 그리고 TreeScope.Children으로는 훨씬 빨리했다, 각 요소에 대해 주위 0,3-0,6 초 걸렸다 01-0,001) – Hansa
wpf 컨트롤을 자동화하는 경우 다음 [msdn-link] (http://msdn.microsoft.com/en-us/library/ms788741(v=vs.110).aspx)를 읽으십시오. 그렇지 않으면 I 죄송합니다 ... "다음 예제에서는 TreeWalker를 사용하는 목록과 FindAll을 사용하여 목록에서 지정된 항목을 검색하는 두 가지 방법을 보여줍니다 첫 번째 기술은 Win32 컨트롤에서 더 빠른 경향이 있지만 두 번째 방법은 Windows 프레젠테이션 파운데이션 (WPF) 컨트롤. " – Hansa