UIAutomation不会返回子元素的值

时间:2017-01-26 06:32:33

标签: c# wpfdatagrid ui-automation textblock

以下是我在Inspect工具中的控制视图,我试图从树下的Text-Block返回值:

Control in Inspect tool

在我的WPF窗口应用程序中,数据网格具有行和列,并尝试获取特定行和列的文本值。第一行的文本值(timestamp)为子树下的Text-Block。

检查控制属性是:

datagrid - Datagrid

Log - DataItemControlType

Item - UIA_CustomControlType(DataGridCell)

自定义 - UIA_CustomControlType(DataGridCell)

text - 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#编码和工具的新手,所以任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

从查看屏幕截图来看,您看起来想要单元格的名称属性。所以代码看起来像这样。我从你的网格控件开始,我还假设这些行的类名为&#34; Record&#34;因为网格中的大多数行的类名称为&#34;记录&#34;。

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;