如何在对项目进行分组的 WPF ItemsControl 上使用 UI 自动化?

2023-11-25

我在用微软用户界面自动化 (i.e. AutomationElement)对我的应用程序运行自动验收测试。这一切进展顺利,但我遇到了一种似乎没有暴露于自动化框架的情况。

我有一个ItemsControl(尽管我可以使用它的派生控件之一,例如ListBox)并且我正在使用CollectionViewSource对项目进行分组。这是一个完整的窗口来演示:

<Window x:Class="GroupAutomation.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Orchestra">
    <Window.Resources>

        <!-- Take some simple data -->
        <XmlDataProvider x:Key="SampleData" XPath="Orchestra/Instrument">
            <x:XData>
                <Orchestra xmlns="">
                    <Instrument Name="Flute" Category="Woodwind" />
                    <Instrument Name="Trombone" Category="Brass" />
                    <Instrument Name="French horn" Category="Brass" />
                </Orchestra>
            </x:XData>
        </XmlDataProvider>

        <!-- Add grouping -->
        <CollectionViewSource Source="{Binding Source={StaticResource SampleData}}" x:Key="GroupedView">
            <CollectionViewSource.GroupDescriptions>
                <PropertyGroupDescription PropertyName="@Category" />
            </CollectionViewSource.GroupDescriptions>
        </CollectionViewSource>
    </Window.Resources>

    <!-- Show it in an ItemsControl -->
    <ItemsControl ItemsSource="{Binding Source={StaticResource GroupedView}}" HorizontalAlignment="Left" Margin="4">
        <ItemsControl.GroupStyle>
            <GroupStyle>
                <GroupStyle.HeaderTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=Name}" FontWeight="Bold" />
                    </DataTemplate>
                </GroupStyle.HeaderTemplate>
            </GroupStyle>
        </ItemsControl.GroupStyle>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Border Padding="4" Margin="4" Background="#FFDEDEDE">
                    <StackPanel>
                        <Label Content="{Binding XPath=@Name}" />
                        <Button Content="Play" />
                    </StackPanel>
                </Border>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
</Window>

这会生成一个窗口,其中包含按类别分组的项目,每个项目都有一个我想使用 UI Automation 单击的按钮:

Screenshot of window with a list
(source: brizzly.com)

但是,如果我查看UISpy.exe(或使用导航AutomationElement)我只看到组(即使在原始视图中):

UISpy
(source: brizzly.com)

正如您所看到的,组在那里,但它们不包含任何项目,因此无处可查找按钮。我在 WPF 3.5 SP1 和 WPF 4.0 中都尝试过此操作,并得到相同的结果。

是否可以对分组的项目使用 UI 自动化?如果可以,如何实现?


我遇到了这个问题并设法通过实现“GenericAutomationPeer”来解决它

  • 帮助编码 UI 框架找到您的自定义控件

并添加一个特殊情况GroupItems.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Automation;
using System.Windows.Automation.Peers;
using System.Windows.Media;
using System.Xml;

namespace ClassLibrary1
{
    public class MyItemsControl : ItemsControl
    {
        protected override AutomationPeer OnCreateAutomationPeer()
        {
            return new GenericAutomationPeer(this);
        }
    }

    public class GenericAutomationPeer : UIElementAutomationPeer
    {
        public GenericAutomationPeer(UIElement owner) : base(owner)
        {
        }
        
        protected override List<AutomationPeer> GetChildrenCore()
        {
            var list = base.GetChildrenCore();
            list.AddRange(GetChildPeers(Owner));
            return list;
        }

        private List<AutomationPeer> GetChildPeers(UIElement element)
        {
            var list = new List<AutomationPeer>();
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++)
            {
                var child = VisualTreeHelper.GetChild(element, i) as UIElement;
                if (child != null)
                {
                    AutomationPeer childPeer;
                    if (child is GroupItem)
                    {
                        childPeer = new GenericAutomationPeer(child);
                    }
                    else
                    {
                        childPeer = UIElementAutomationPeer.CreatePeerForElement(child);
                    }
                    if (childPeer != null)
                    {
                        list.Add(childPeer);
                    }
                    else
                    {
                        list.AddRange(GetChildPeers(child));
                    }
                }
            }
            return list;
        }
    }

}

我希望这对仍在寻找答案的人有所帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在对项目进行分组的 WPF ItemsControl 上使用 UI 自动化? 的相关文章

  • WPF 中的数据绑定?

    我正在尝试在 WPF 中设置数据绑定 我有班级人员 它通过一个文本框进行更新 类似老式的 另一个文本框应该通过数据绑定镜像对人员对象的更改 它曾经是 type twoway 但抛出了xamlparse 异常 它不是这样工作的 点击显示 pe
  • Team Foundation Server 2012 Express BuildTemplate 进程 xaml 文件未打开

    我安装了 Visual Studio 2013 Express 版本 12 0 21005 1REL 并安装了 Team Foundation Server 2012 Express 我需要更改构建过程 xaml 文件 但是当我从源代码管理
  • 传递给命令 WPF 的多个参数[重复]

    这个问题在这里已经有答案了 我有以下层次结构 abstract class TicketBase public DateTime PublishedDate get set class TicketTypeA TicketBase publ
  • 如何循环访问 WPF StackPanel 静态项目?

    可能很容易 但我很难弄清楚这一点 谷歌似乎也没有多大帮助 如何循环遍历 StackPanel 的静态声明元素 无数据绑定 元素在 xaml 中声明 任何帮助表示赞赏 你的意思是StackPanel的孩子们 foreach var child
  • 如何将 ObservableCollection 绑定到 AvalonDock DocumentPaneGroup?

    我需要在 AvalonDock 2 0 中加载项目集合作为文档 这些对象继承自一个抽象类 我想根据哪个子类在文档中渲染一个框架 这是我的 XAML
  • 如何在 WPF 中实现虚线或点线边框?

    我有一个ListViewItem我正在申请Style到 我想把灰色虚线作为底部Border 我怎样才能在 WPF 中做到这一点 我只能看到纯色画笔 这在我们的应用程序中效果很好 允许我们使用真正的边框而不是乱用矩形
  • 如何在wpf中打印屏幕截图

    首先我英语说得不太流利 反正 我正在尝试这样做 然而这还不是第三天 我现在正在做的是屏幕捕获后的程序屏幕打印 我参考这段代码 https social msdn microsoft com Forums windows en US 0623
  • WPF 元素宿主内存泄漏

    我在 Windows 窗体上使用元素主机时遇到奇怪的内存泄漏 我有一个主窗体 它打开另一个窗体 该窗体上只有 elementhost 控件 此时 它没有 wpf 控件子控件 只能打开 1 个主机表单 每次我打开窗体时 应用程序内存都会增加2
  • 使用 INotifyPropertyChanged

    有人可以解释一下为什么在 wpf 中使用绑定时需要使用 INotifyPropertyChanged 的 实现吗 我可以在不实现此接口的情况下绑定属性吗 例如我有代码 public class StudentData INotifyProp
  • 网格内的 ContentPresenter 可见性绑定不起作用?

    我有以下网格
  • 无法使用 DialogResult

    我尝试使用DialogResult检查一个Messagebox s 是 否 取消 我正在使用以下代码 我没有看到任何问题 DialogResult dlgResult MessageBox Show Save changes before
  • 使 DataTemplate 可混合

    如何为 ViewModel 制作可混合的数据模板 可在表达式混合中设计 当我转到资源并尝试直接编辑数据模板时 我在绘图板上看到的只是一个空白矩形 这是因为 DataTemplate 没有绑定到任何东西 当然 我可以创建一个 UserCont
  • 更改鼠标悬停时的矩形背景

    所以我有一个没有背景的矩形 当用户将鼠标悬停在其上时 我想给它一个背景渐变 然后当鼠标离开矩形时删除渐变 请有人发布所需的代码 并告诉我将其放在 cs xaml 文件中的位置吗 Thanks This
  • 滚动到 ScrollViewer 末尾的最佳方法

    目前 当我添加新项目时 我让代码自动滚动到末尾的唯一方法如下 XAML
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • Wpf TextBlock 中的垂直文本

    是否可以垂直显示 TextBlock 中的文本 以便所有字母彼此堆叠 不使用 LayoutTransform 旋转 还没有人提到使用纯 XAML 垂直堆叠任意字符串的字母 不旋转它们 的明显而简单的方法
  • CommandManager.InvalidateRequerySuggested 不会导致对 MVVM-Light 中的 CanExecute 进行重新查询

    我正在使用 MVVM Light RelayCommand private ICommand myRevertCmd public ICommand Revert get if myRevertCmd null myRevertCmd ne
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如

随机推荐

  • “索引”对象没有属性“tz_localize”

    我正在尝试转换 csv 文件中时间 日期列 Created At 中 GMT 时间的所有实例 以便其全部采用 EST 格式 请看下面 import pandas as pd from pandas tseries resample impo
  • String.intern() 线程安全有保证吗?

    是否有任何书面保证String intern 线程安全吗 javadoc 提到了它 但没有直接解决它 返回字符串对象的规范表示 一池 字符串最初为空 由 String 类私有维护 当调用intern方法时 如果池中已经包含一个 由 equa
  • NGINX 负载平衡 Turn 服务器

    我正在尝试将负载均衡器放在 Turn 服务器前面 以便与 WebRTC 一起使用 我在下面的示例中使用单轮服务器 直到负载均衡器正常工作 Turn 服务器需要多个端口 包括一个 UDP 如下所示 TCP 80 TCP 443 TCP 347
  • 如何在 Django 中获取 GET 请求值?

    我当前正在定义正则表达式 以便捕获 URL 中的参数 如教程中所述 如何从 URL 访问参数作为HttpRequest object My HttpRequest GET目前返回一个空的QueryDict object 我想学习如何在没有库
  • 按 ROW_NUMBER 排序

    UPD 谢谢大家 话题结束了 睡觉后我明白了一切 我在理解 OVER 子句和 ROW NUMBER 函数时遇到问题 简单的表格 名称和标记 我想计算每个名字的平均分 SELECT top 1 with ties name ROW NUMBE
  • Java 和 AppStore 收据验证

    我正在尝试在服务器端验证付款收据 我得到了 status 21002 exception java lang IllegalArgumentException 作为回报 这是代码 private final static String sa
  • Python 导入 web 不起作用

    因此 在运行导入的脚本时出现以下错误web python bin app py Traceback most recent call last File bin app py line 1 in
  • 注册应用程序以从 Safari 的“共享”或“打开方式...”对话框打开不起作用。 (尽管可以在其他应用程序中使用)

    我正在尝试注册我的应用程序 以便当用户单击 html 网页上的共享按钮时 它会显示在 Safari 打开方式 对话框中 我已经添加了public html and public data为了更好地衡量 内容类型到 Xcode 中的文档类型
  • 当前时间等于指定时间时如何播放声音

    在我的网页中 我想在当前时间等于 时播放声音 例如 下午 5 00 我所做的是 我寻找一个播放声音的特定函数 我发现document write这不起作用 也没有意义 有什么建议我应该做什么 在 JS 中试试这个
  • 带文字且无分隔符的 DateTimeFormatter 模式不起作用

    解析器生成的DateTimeFormatter ofPattern表现出以下有趣的行为 这阻止我编写模式来解析字符串 例如20150100 System out println DateTimeFormatter ofPattern yyy
  • Jquery Ajax 发布到 Django 视图

    我正在尝试找出将发布数据发送到 Django View 函数的最佳方法 我目前的 jquery 代码是这样的 var name Joe var age 20 ajax url do something type POST data name
  • 使用 Java Servlet 访问 post 变量

    PHP 的 Java 等价物是什么 POST 在网上搜索了一个小时后 我仍然距离目标还很远 这是一个简单的例子 我对 html 或 servlet 不太感兴趣 但您应该明白了 我希望这可以帮助你
  • Android Studio 无法与 gradle 2.10 和 gradle 插件 2.0.0-alpha5 正常工作

    在更新到 Android Studio 2 0 预览版 5 之前 我使用 com android tools build gradle 2 0 0 alpha3 和 gradle 2 8 效果很好 在我更新到 2 0 预览版 5 后 它告诉
  • Python解析非标准XML文件

    我的输入文件实际上是附加到一个文件的多个 XML 文件 来自于谷歌专利 它具有以下结构
  • 行版本和性能

    我想知道添加一个是否会对性能产生影响行版本Sql Server 数据库中表的列 对性能影响很小 rowversion 只是旧时间戳数据类型的新名称 因此您的数据库将需要存储额外的二进制字段 当您尝试对此数据进行查询时 您的性能会受到更大的影
  • 如何使用 Oauth2 和 chrome.identity 获取 Facebook 令牌

    我在打包应用程序中使用 chrome identity 来使用 Facebook 获取用户令牌 我调用 chrome identity launchWebAuthFlow 我需要获取访问令牌 将其发送到服务器 然后使用访问令牌来验证用户 与
  • iOS 上不支持全局 PushAsync,请使用 NavigationPage

    当我处理 a 的 Tap 事件时 一切工作正常ListView项目 但是当我在TabbedPage它显示了异常 请提供此问题的解决方案 提前致谢 例外 iOS 上不全局支持 PushAsync 请使用 NavigationPage 这是 X
  • Notepad++ 显式量词表示法

    我一直在使用 Notepad 正则表达式引擎 但有一些东西我无法工作 它是显式量词符号 我在这里看到了一些其他帖子 其中使用了以下语法 expr 1 2 但是 当我在测试中使用它时 就像这样简单k 1 1 其中要搜索的文本是 k 没有匹配项
  • 如何在程序内设置 OpenMP 线程数?

    运行程序为 OMP NUM THREADS 4 a out 将活动 OpenMP 线程数限制为 4 如下所示htop 但是 如果不是绑定OMP NUM THREADS环境变量在Bash I call setenv OMP NUM THREA
  • 如何在对项目进行分组的 WPF ItemsControl 上使用 UI 自动化?

    我在用微软用户界面自动化 i e AutomationElement 对我的应用程序运行自动验收测试 这一切进展顺利 但我遇到了一种似乎没有暴露于自动化框架的情况 我有一个ItemsControl 尽管我可以使用它的派生控件之一 例如Lis