问题标签 [automationpeer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
577 浏览

wpf - AutomationPeer,当孩子被移除时更新 UIA 树

(这里是 UI 自动化和 WPF 的初学者,所以也许我做错了。)

我们有一个自定义控件,可以显示要交互式查看或编辑的项目。在添加 UI 自动化支持时,我现在使用了该控件的适当实现OnCreateAutomationPeer并实现了AutomationPeer特定的控件。在大多数情况下,事情似乎运行良好。我可以在 UIA 树中看到我们的孩子,当我添加孩子时,他们会出现在那里。

从我现在在 .NET 源代码中看到的情况来看, thr 树的更改会自动工作,因为UpdateLayoutWPF 内部的每个更改都会导致各自AutomationPeer的 s 刷新它们的子树。所以这些东西开箱即用。

但是,在删除项目时 my不会被调用,显然AutomationPeer是因为当 a从其树中删除GetChildrenCore时 WPF 并不真正需要更新任何内容。Visual这会导致 UIA 树包含不再存在的元素。

现在我想知道,这通常应该如何工作。我看到有些控件AutomationPeer在发生变化时会直接通知它们的 s。这可能是一条路线。或者我们的自定义控件是否应该做一些不同的事情,以便即使在删除某些内容时也会发生布局?

0 投票
0 回答
125 浏览

c# - AutomationPeer.ListenerExists 在 Windows Server 2012 上返回 true

我有一个在 Windows Xp 和 Windows 7 上正确运行的 WPF 应用程序。当我在 Windows 服务器 2012 上安装它时,我意识到处理 AutomationPeers 时发生错误。这是堆栈跟踪的一部分:

...在 System.Windows.Automation.Peers.AutomationPeer.EnsureChildren() 在 System.Windows.Automation.Peers.AutomationPeer.UpdateChildrenInternal(Int32 invalidateLimit) 在 System.Windows.Automation.Peers.AutomationPeer.UpdateSubtree() 在系统。 Windows.Automation.Peers.AutomationPeer.UpdatePeer(Object arg) 在 System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 在 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method,对象 args、Int32 numArgs、委托 catchHandler)

我查看了引发该异常的控件的源代码,我意识到这部分代码只有在调用静态方法时才能运行:

返回真。

为什么在所有其他系统上,调用

全部返回false,而在该Windows 2012服务器上它返回true?

有没有办法删除这些听众?

注意:我的应用程序是在发布模式下构建的。

0 投票
1 回答
484 浏览

c# - WPF System.OutOfMemoryException System.Windows.Automation.Peers.AutomationPeer.UpdateSubtree

我在 .NET 框架 4.5.1 上构建了一个 WPF 桌面应用程序。它“通常”工作正常,但是在某些机器上,在运行时,当 WPF 数据网格将要显示时,会出现 System.OutOfMemoryException。

堆栈跟踪报告:

非工作机器是 32 位、Windows 7、2 GB RAM、.NET 框架 4.5.1。

我必须说数据网格只显示几行。我一直在网上寻找类似的错误,但我找不到任何合适的解决方案。

有什么建议吗?

谢谢!

0 投票
0 回答
421 浏览

c# - 如何检测计算机激活 WPF 自动化对等方的原因?

我们的应用程序在某些计算机上崩溃,因为它们有一些激活 WPF 自动化对等点的软件。有没有办法知道哪个应用程序正在激活它们?

我们有一个堆栈跟踪,显示以下代码:

您可以在调用堆栈的中间看到自动化 API 触发。在大多数机器上,这不会发生,并且应用程序运行良好。

我们可以解决真正的问题,但鉴于这发生在非常小的一组机器上,我认为停止启用自动化子系统的应用程序会更快。

0 投票
0 回答
41 浏览

wpf - 如何区分编码的 UI 和屏幕阅读器?

我们已经覆盖了OnCreateAutomationPeer实现编码 UI 的方法。屏幕阅读器也OnCreateAutomationPeer需要这样做(例如,Windows 中的讲述人工具默认屏幕阅读器工具)。

是否有可能区分OnCreateAutomationPeer是从屏幕阅读器或编码 UI 触发的?

0 投票
1 回答
154 浏览

.net - 为什么 ListBoxItem.OnCreateAutomationPeer() 返回 ListBoxItemWrapperAutomationPeer?

在 .NET Framework 4.7.1 中,ListBoxItem.OnCreateAutomationPeer()返回一个 ListBoxItemWrapperAutomationPeer。

有人知道为什么它不返回 ListBoxItemAutomationPeer 吗?它会更有用,因为 ListBoxItemWrapperAutomationPeer 不做任何事情,但 ListBoxItemPeer 允许选择模式。

0 投票
1 回答
571 浏览

c# - C# 中带有 IExpandCollapseProvider 的自定义 FrameWorkElementAutomationPeer 的内存泄漏

我们使用 AutomationUIClient 控制台应用程序来测试我们的 WPF 应用程序。

我们在 WPF 应用程序中设置了一个自定义类 TreeItemAutomationPeer 与 ISelectionProvider 和 IExpandCollapseProvider

如果此对象由自动化应用程序控制台使用,则所有者(在我的情况下为 TreeItem)被保留,因此它会泄漏......

我们添加最后一个方法 GetChildrenCore() 以防止来自 Children 的内存泄漏。

TreeItem 类实现 IRawElementProviderSimple

这是 DotMemory 的泄漏:

DotMemory 泄漏

当我拍摄快照时,控制台应用程序仍附加到 WPF 应用程序。

如何从 ExpandCollapseProviderWrapper 释放 TreeItemAutomationPeer 的所有者以防止泄漏?

在控制台应用程序中,我们获得了 AutomationElement 对象。是否有我们使用的所有 AutomationElement 的列表以及释放它们的方法?

非常感谢 :)

虽然真实

编辑 :

根据 dotmemory 文档 ( https://www.jetbrains.com/help/dotmemory/Analyzing_GC_Roots.html ) RefCounted 句柄是:

如果对象的引用计数是某个值,则根会阻止垃圾收集。如果使用 COM Interop 将对象传递给 COM 库,CLR 会为此对象创建一个 RefCounted 句柄。由于 COM 无法执行垃圾回收,因此需要此根。相反,它使用引用计数。如果不再需要该对象,COM 将计数设置为 0。这意味着 RefCounted 句柄不再是根,可以收集该对象。因此,如果您看到 RefCounted 句柄,那么很可能该对象作为参数传递给非托管代码。

0 投票
0 回答
134 浏览

wpf - Winium 驱动程序仅在打开 inspect.exe 时才识别 WPF 控件内部元素,否则将引发“未找到元素”异常

我的 WPF 自定义控件具有内部元素。就我而言,我的自定义控件是网格,内部元素是单元格。您可以在下面找到 AutomationPeer 实现,

我的问题是,只有在打开 inspect.exe 时,它​​才能在 Winium 测试脚本中正确识别。如果 inspect.exe 没有打开,Winium 会抛出“Element not found”异常。

下面是我的测试脚本,

异常详情,

在此处输入图像描述

请为此建议我任何解决方案。

0 投票
0 回答
55 浏览

.net - 未在 ListView 控件的 ViewBase 的自定义实现中创建 ViewAutomationPeer

我正在扩展 WPF 框架ListView中内置的功能。我已经通过使用多个ListView并正确同步它们来完成冻结列功能。现在我想将此功能移动到单个ListView中——在这种情况下,我认为最好以与制作GridView类似的方式提供ViewBase类的自定义实现。这将允许我重写AutomationPeers以及GridViewRowPresenterGridViewHeaderRowPresenter,它们负责单元格的定位和尺寸(据我所知)。

我遵循了 Microsoft 的示例ListView CustomView但是这个示例的核心部分似乎被破坏了 -从未创建自定义ViewAutomationPeer :

如何在ListView控件的ViewBase的自定义实现中正确创建ViewAutomationPeer

0 投票
0 回答
216 浏览

c# - 在设置 DataContext 之前过早调用 WPF OnCreateAutomationPeer

语境

我们有一个内部托管许多视图的 WPF 控件。这些视图又是其他 WPF 控件。视图基于作为主视图一部分的下拉菜单变得可见。父级最终使用ToolkitElementHost. 主视图和两个子视图具有为我们的测试用例定义的自定义自动化对等点。被OnCreateAutomationPeer所有视图覆盖。父视图调用OnCreateAutomationPeer子视图。所有视图都使用DataContext父视图(即由树层次结构组成的 ViewModel)。

问题陈述

主视图是作为 Prism 模块的一部分创建的。但是,DataContext在初始化期间未设置。根据DataContext整个 UI 容器服务的初始化,在稍后的时间点设置。在某些情况下,我们观察到OnCreateAutomationPeer即使snoop在系统上运行了类似的显式 AutomationClient 也会触发。这会导致在调用NullReferenceException中抛出,因为for 子视图仍然为空。OnCreateAutomationPeerDataContext

到目前为止尝试过的解决方案

我们可以通过简单地进行空检查并从中返回空值来克服这个问题OnCreateAutomationPeer。重复调用此方法。在DataContext最终设置了一段时间后,OnCreateAutomationPeer得到了正确的值。一般来说,关于 StackOverflow 的建议是不要禁用 AutomationPeer。

问题

  1. 在什么时候DataContext从父控件传递到子控件?
  2. 是否取决于父视图中设置DataContext和调用的顺序?InitializeComponent
  3. 我们如何使我们的代码更具确定性,以便我们不必依赖子视图中的 DataContext 的空检查?
  4. 如何在父视图级别进行测试?这是为了确保未来的更改不会再次破坏此功能。

调用栈