2

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

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

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

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

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

4

1 回答 1

0

我在 ItemsControl 上遇到过类似的问题 - 我动态更新内容,它不会刷新子项以供自动化使用。

在我的用户控件中,我添加了在 viewmodel 事件上触发的代码,然后在自动化对等方上调用了 ResetChildrenCache()。我的代码如下所示:

viewModel.DisplayedFaults.CollectionChanged += (sender, args) =>
{
    automationPeer = UIElementAutomationPeer.FromElement(AutomationUiItemsControl);
    if (automationPeer != null)
    {
        automationPeer.ResetChildrenCache();
    }
};

它基于这篇文章https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/636a37a6-d766-46f8-bafb-d4d9a7816345/wpf-ui-automation-on-a-treeview?forum=窗户可访问性和自动化

我发现与此类事情相关的另一个有用链接是: 页面上的某些控件对于 MS UI 自动化不可见

于 2020-04-07T23:27:42.863 回答