获取WPF UserControl的AutomationElement

时间:2016-11-28 10:18:02

标签: c# wpf ui-automation automationelement

我想在测试期间使用Windows AutomationElement来模拟Userinput。 我的特殊用法是使用ListBox选择进行人工操作,从我在网上找到的内容中,我需要为我的列表框设置一个AutomationElement来操作它。

假设我有一个这样的窗口:

<Window x:Class="CryptoAdmin_Test.Helper.FreshWindow"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:CryptoAdmin_Test.Helper">
    <StackPanel>
        <UserControl x:FieldModifier="public" x:Name="FindMe" />
    </StackPanel>
</Window>

由于我有对UserControl的引用,我应该能够在不从桌面开始搜索的情况下找到它(AutomationElement.RootElement)。

AutomationElement window.FindMe获取UserControl的最快方法是什么?

使用AutomationElement.RootElement.FindFirst(...);将从桌面开始,我没有看到一种通用的方法,可以快速进行此搜索而不会出现误报。

1 个答案:

答案 0 :(得分:1)

这应该是找到它的最快方法。这也假设你给窗口一个名字,否则除非你从你的应用程序启动进程并且有一个进程ID,否则它很难找到。

AutomationElement mainWindow = AutomationElement.RootElement.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "MainWindow"));
AutomationElement findMe = mainWindow.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "FindMe"));

由于TreeScope设置为子视图,因此在查找相关元素时不会扫描整个树。根据您的用户控制的内容,您获取的元素可能是一些无用的东西。如果没有为您的控件实现一些自定义模式,您将能够做的唯一事情就是从中获取其他元素。