用户控件从UIAutomation模糊的UI元素

时间:2012-01-26 19:48:13

标签: wpf ui-automation

我有一个自动化客户端,它使用AutomationElement.FromPoint方法获取游标下的AutomationElement:

 AutomationElement element = AutomationElement.FromPoint(point);

通常这很好用,但我一直遇到某些WPF应用程序的问题。当UserControl与另一个重要UI元素在同一UI级别上时,会出现此问题。

例如:

<Window x:Class="wpfTestApp.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" xmlns:c="clr-namespace:wpfTestApp">
<Window.Resources>
    <c:NameList x:Key="NameListData"/>
</Window.Resources>
    <Grid>
        <ListBox ItemsSource="{Binding Source={StaticResource NameListData}}" 
             Height="300" HorizontalAlignment="Left" Margin="10,10,0,0" Name="listBox1" 
             VerticalAlignment="Top" Width="153" >
        </ListBox>
        <UserControl Name="exampleUserControl">
              <TextBlock Visibility="Hidden">Loading...</TextBlock>
        </UserControl>
    </Grid>
</Window>

当我尝试指向任何列表框项目(甚至是列表框本身)时,我得到的只是“exampleUserControl”。

我知道还有其他方法可以获取不依赖于位置的AutomationElements,但在这种情况下,这是我唯一的选择,因为我们试图获取光标下的元素。问题是,在这种情况下,重要元素(即列表框项)被这个不重要的项(“exampleUserControl”包含“Loading ...”文本)所掩盖。

是否有替代FromPoint方法,或者我可以通过某种方式忽略这些元素?

2 个答案:

答案 0 :(得分:0)

有几种方法可以找到/搜索Element。

您可以在MSDN http://msdn.microsoft.com/en-us/library/ms606809上找到这些界面 例如:

AutomationElement.FindFirst - http://msdn.microsoft.com/en-us/library/system.windows.automation.automationelement.findfirst

AutomationElement.FindAll - http://msdn.microsoft.com/en-us/library/system.windows.automation.automationelement.findall

  

//示例:查找第一个Element和classname =“”SciCalc“   AutomationElement calcRoot = AutomationElement.RootElement.FindFirst(TreeScope.Children,                       new PropertyCondition(AutomationElement.ClassNameProperty,“SciCalc”));

“AutomationElement.RootElement”是所有当前打开的窗口和控件的父级。 为了提高性能,您可以先找到目标窗口,然后扫描Target窗口的AutomationElement上的控件。

例如:您可以先通过“AutomationElement.FindFirst”或“AutomationElement.FromHandle”找到并创建目标WPF窗口,然后在目标窗口中搜索列表框。

答案 1 :(得分:0)

问题的清晰解决方案是将Visibility="Hidden"设置为UserControl而不是TextBlock