(这里是UI自动化和WPF的初学者,所以我可能做错了。)
我们有一个自定义控件,它显示要交互查看或编辑的项。在添加UI自动化支持时,我现在使用了OnCreateAutomationPeer的适当实现,并实现了特定于该控件的AutomationPeer。在大多数情况下,事情似乎都很顺利。我可以在UIA树中看到我们的孩子,当我添加孩子时,他们就出现在那里。
从我现在在.NET源代码中看到的情况来看,这棵树的变化是自动的,因为来自WPF内部的每个UpdateLayout都会导致相应的AutomationPeer刷新它们的子树。所以从盒子里看,这些东西很好用。
然而,当删除一个项目时,我的AutomationPeer的GetChildrenCore不会被调用,显然是因为当从树中删除Visual时,WPF实际上不需要更新任何东西。这将导致包含不再存在的元素的UIA树。
不过,现在我想知道,总体来说,这是如何运作的。我看到一些控件在发生变化时直接通知它们的AutomationPeer。这可能是条路。或者,我们的自定义控件应该做一些不同的事情,这样布局就会发生,即使某些东西被移除了?
发布于 2020-04-07 23:27:42
对于ItemsControl,我也遇到了类似的问题--我会动态地更新内容,并且它不会刷新子程序以供自动化使用。
在我的用户控件中,我添加了在viewmodel事件上触发的代码,该事件随后在自动化对等点上称为ResetChildrenCache()。我的代码是这样的:
viewModel.DisplayedFaults.CollectionChanged += (sender, args) =>
{
automationPeer = UIElementAutomationPeer.FromElement(AutomationUiItemsControl);
if (automationPeer != null)
{
automationPeer.ResetChildrenCache();
}
};我发现的另一个与这类相关的有用链接是:Some controls on a page are not visible for MS UI Automation
https://stackoverflow.com/questions/25283552
复制相似问题