Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf AutomationPeer,在删除子项时更新UIA树_Wpf_Ui Automation_Automationpeer - Fatal编程技术网

Wpf AutomationPeer,在删除子项时更新UIA树

Wpf AutomationPeer,在删除子项时更新UIA树,wpf,ui-automation,automationpeer,Wpf,Ui Automation,Automationpeer,(这里是UI自动化和WPF的初学者,所以我可能做错了。) 我们有一个自定义控件,用于显示要交互查看或编辑的项目。在添加UI自动化支持时,我现在使用了相应的OnCreateAutomationPeer实现,并实现了一个特定于该控件的AutomationPeer。在大多数情况下,事情似乎进展顺利。我可以在UIA树中看到我们的孩子,当我添加孩子时,他们会出现在那里 从我现在在.NET源代码中看到的情况来看,树更改是自动工作的,因为WPF内部的每个UpdateLayout都会导致相应的Automatio

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

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

从我现在在.NET源代码中看到的情况来看,树更改是自动工作的,因为WPF内部的每个
UpdateLayout
都会导致相应的
AutomationPeer
s刷新其子树。所以这些东西在开箱即用的情况下很好

然而,当删除一个项目时,my
AutomationPeer
GetChildrenCore
不会被调用,这显然是因为当从树中删除一个
Visual
时,WPF实际上不需要更新任何内容。这将导致UIA树包含不再存在的元素


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

我对ItemsControl也有类似的问题-我会动态更新内容,并且不会刷新子控件以供自动化使用

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

viewModel.DisplayedFaults.CollectionChanged += (sender, args) =>
{
    automationPeer = UIElementAutomationPeer.FromElement(AutomationUiItemsControl);
    if (automationPeer != null)
    {
        automationPeer.ResetChildrenCache();
    }
};
它是基于这篇文章的

我发现的另一个与这类事情相关的有用链接是: