我有一个自动化客户端,它使用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方法,或者我可以通过某种方式忽略这些元素?
答案 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