2017-01-26 18 views
1

После моей точки зрения управления в Осмотреть инструмент, и я пытаюсь вернуть значение из текстового блока под деревом:UIAutomation не будет возвращать значение элемента детей

Control in Inspect tool

В моем приложении WPF окна , datagrid имеет строки и столбцы и пытается получить текстовые значения для определенной строки и столбца. Первая строка имеет текстовое значение (временную метку) в качестве текстового блока под поддеревом.

Проверьте свойства управления являются:

DataGrid - Datagrid

Log - DataItemControlType

Предмет - UIA_CustomControlType (DataGridCell)

Custom - UIA_CustomControlType (DataGridCell)

текст - UIA_TextControlTypeID

Я могу получить общее количество строк, но не могу получить текстовое значение.

var gridChilds = grid.LowLevelAutomationObject.FindAll(System.Windows.Automation.TreeScope.Children, Condition.TrueCondition).OfType<AutomationElement>(); 
var rows = gridChilds.Count() ; 

List<AutomationElement> messages = new List<AutomationElement>(); 
      TreeWalker walker = new TreeWalker(new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.DataItem)); 
      AutomationElement ae = grdControl as AutomationElement; 
      AutomationElement row = walker.GetFirstChild(ae); 

       messages.Add(row); 
      row = walker.GetNextSibling(row); 
      string result = Convert.ToString(row); 
      return result ; 

Я попробовал некоторые решения из онлайн-справки по аналогичным вопросам, но ни один из них не работал для моего примера. Я новичок в кодировании C# и инструменте, поэтому любая помощь будет принята с благодарностью.

ответ

0

От взгляда на экранный снимок осмотра похоже, что вы хотите свойство name для ячейки. Таким образом, код будет выглядеть примерно так. Я начал с управления сеткой, и я также предположил, что строки имеют имя класса «Запись», так как большинство строк в сетках будут иметь имя класса «Запись».

AutomationElement dataGrid = grdControl as AutomationElement; 
AutomationElement outerRow = dataGrid.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ClassNameProperty, "Record")); 
AutomationElement innerRow = outerRow.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ClassNameProperty, "Record")); 
AutomationElement custom = innerRow.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.LocalizedControlTypeProperty, "custom")); 
AutomationElement text = custom.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.LocalizedControlTypeProperty, "text")); 

return text.Name; 
+0

Макс Янг, Большое вам спасибо, я смог получить работу вокруг чего-то похожего на вышеупомянутое решение, которое вы предоставили. Что-то, что «приятно иметь» - это цикл на пользовательском уровне и на основе номера строки, который я даю, он должен получить текстовое значение. Но большое вам спасибо за ваше время :) – cherryS

+0

Нет проблем, если вам нужна помощь в UI Automation, не стесняйтесь сообщать мне. Ужасно учиться UI Automation с доступными ресурсами. –

+0

Несомненно, большое вам спасибо за помощь. – cherryS