.net - 可以为整个 WPF 4.0 应用禁用 UI 自动化吗?

标签 .net wpf ui-automation microsoft-ui-automation

我们正在开发供内部使用的 WPF 4.0 应用程序。
在某些客户端上,由于 UI 自动化,我们遇到了巨大的性能问题
(这些客户端安装了平板电脑服务笔、触摸等软件)。

这是 WPF 4.0 的一个已知问题,请参见例如:

  • WPF performance issue due to UI Automation
  • WPF UI Automation issue

  • 我们已经能够在规范非常有限的机器上重现这个问题。
    在这台机器上打开 WPF 窗口需要:
  • 00:00:02 - 没有安装任何 UI 自动化触发软件
  • 00:01:41 - 安装了 UI 自动化触发软件(用于此测试的 RoboForm)
  • 00:00:09 - 安装了 UI 自动化触发软件,并应用了修补程序 KB2484841

  • 如您所见,安装修补程序 KB2484841 是一个巨大的改进,但仍然不如未安装 ui Automation 触发软件的运行速度快。
    此外,我们无法控制在客户端安装哪些软件,因此很难为所有客户端推出此修复程序。

    因此,是否可以“关闭”整个 WPF 应用程序的 UI 自动化?
    我知道它可以在每个 UserControl 的基础上完成,但是整个应用程序是否可能?

    我已经尝试了 this 中提供的代码发布,但没有成功。

    谢谢你的时间,
    公园

    最佳答案

    我们遇到了问题中提到的完全相同的问题,其中 UI 自动化客户端影响了我们 WPF 的性能。应用。

    在尝试了所有修补程序和解决方法之后,我们终于找到了解决方案。每个 UI 控件都有一个 AutomationPeer公开当前控件及其子控件的属性的对象。 UI 自动化客户端使用这些 AutomationPeer对象以获取有关 UI 控件的信息。 WPF 中的大多数 UI 控件都有内置的自动化对等类。我们还可以创建自定义对等类。

    以下是自定义自动化对等类。请注意,在 GetChildrenCore方法,它返回一个空列表而不是实际子控件的列表。

    public class CustomWindowAutomationPeer : FrameworkElementAutomationPeer
    {
        public CustomWindowAutomationPeer(FrameworkElement owner) : base(owner) { }
    
        protected override string GetNameCore()
        {
            return "CustomWindowAutomationPeer";
        }
    
        protected override AutomationControlType GetAutomationControlTypeCore()
        {
            return AutomationControlType.Window;
        }
    
        protected override List<AutomationPeer> GetChildrenCore()
        {
            return new List<AutomationPeer>();
        }
    }
    

    然后在您的主窗口中,覆盖 OnCreateAutomationPeer方法:
    protected override System.Windows.Automation.Peers.AutomationPeer OnCreateAutomationPeer()
    {
        return new CustomWindowAutomationPeer(this);
    }
    

    现在,当 UI 自动化客户端尝试获取主窗口的子控件时,它会返回一个空列表,因此无法遍历其余控件。

    请参阅此 MSDN article更多细节。

    关于.net - 可以为整个 WPF 4.0 应用禁用 UI 自动化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17297539/

    相关文章:

    android - 当我运行我的 android UIAutomator 代码时,它显示错误

    reactjs - Testcafe - 单击按钮后如何获取更新状态值

    excel - 使用 excel 实现 UI 自动化

    C# 程序关闭

    c# - 下载多个文件的更快方法

    c# - WPF C# 中的 system.windows.form.key

    c# - WPF:是否有资源更改触发的事件

    c# - .NET 中不同运行时间执行的相同正则表达式

    c# - VB 与 C# — CType 与 ChangeType

    c# - 防止最大化的 WPF 窗口覆盖任务栏