Wpf AutomationPeer,在删除子项时更新UIA树
(这里是UI自动化和WPF的初学者,所以我可能做错了。) 我们有一个自定义控件,用于显示要交互查看或编辑的项目。在添加UI自动化支持时,我现在使用了相应的Wpf AutomationPeer,在删除子项时更新UIA树,wpf,ui-automation,automationpeer,Wpf,Ui Automation,Automationpeer,(这里是UI自动化和WPF的初学者,所以我可能做错了。) 我们有一个自定义控件,用于显示要交互查看或编辑的项目。在添加UI自动化支持时,我现在使用了相应的OnCreateAutomationPeer实现,并实现了一个特定于该控件的AutomationPeer。在大多数情况下,事情似乎进展顺利。我可以在UIA树中看到我们的孩子,当我添加孩子时,他们会出现在那里 从我现在在.NET源代码中看到的情况来看,树更改是自动工作的,因为WPF内部的每个UpdateLayout都会导致相应的Automatio
OnCreateAutomationPeer
实现,并实现了一个特定于该控件的AutomationPeer
。在大多数情况下,事情似乎进展顺利。我可以在UIA树中看到我们的孩子,当我添加孩子时,他们会出现在那里
从我现在在.NET源代码中看到的情况来看,树更改是自动工作的,因为WPF内部的每个UpdateLayout
都会导致相应的AutomationPeer
s刷新其子树。所以这些东西在开箱即用的情况下很好
然而,当删除一个项目时,myAutomationPeer
的GetChildrenCore
不会被调用,这显然是因为当从树中删除一个Visual
时,WPF实际上不需要更新任何内容。这将导致UIA树包含不再存在的元素
但现在我想知道,这在一般情况下是如何工作的。我看到一些控件在某些内容发生更改时直接通知他们的
AutomationPeer
s。这可能是一条路线。或者我们的自定义控件是否应该做一些不同的事情,以便即使在删除某些内容时也能进行布局?我对ItemsControl也有类似的问题-我会动态更新内容,并且不会刷新子控件以供自动化使用
在我的用户控件中,我添加了在viewmodel事件中触发的代码,然后在自动化对等机上调用ResetChildrenCache()。
我的代码如下所示:
viewModel.DisplayedFaults.CollectionChanged += (sender, args) =>
{
automationPeer = UIElementAutomationPeer.FromElement(AutomationUiItemsControl);
if (automationPeer != null)
{
automationPeer.ResetChildrenCache();
}
};
它是基于这篇文章的
我发现的另一个与这类事情相关的有用链接是: