C# 元素不存在或已虚拟化;如果支持,请使用VirtualizedItem模式

C# 元素不存在或已虚拟化;如果支持,请使用VirtualizedItem模式,c#,.net,wpf,windows,C#,.net,Wpf,Windows,我们有一个WPF应用程序。我们的一些客户遇到了崩溃,我无法在我的机器上重现。我从他们的机器上获得的所有信息都在堆栈跟踪之下,堆栈跟踪只包含WPF代码,因此我实际上无法确定我的应用程序中是什么代码导致了此问题 System.Windows.Automation.ElementNotAvailableException: Element does not exist or it is virtualized; use VirtualizedItem Pattern if it is supporte

我们有一个WPF应用程序。我们的一些客户遇到了崩溃,我无法在我的机器上重现。我从他们的机器上获得的所有信息都在堆栈跟踪之下,堆栈跟踪只包含WPF代码,因此我实际上无法确定我的应用程序中是什么代码导致了此问题

System.Windows.Automation.ElementNotAvailableException: Element does not exist or it is virtualized; use VirtualizedItem Pattern if it is supported.
at System.Windows.Automation.Peers.ItemAutomationPeer.ThrowElementNotAvailableException()
at System.Windows.Automation.Peers.ItemAutomationPeer.GetItemStatusCore()
at System.Windows.Automation.Peers.AutomationPeer.UpdateSubtree()
at System.Windows.Automation.Peers.AutomationPeer.UpdateSubtree()
at System.Windows.Automation.Peers.AutomationPeer.UpdatePeer(Object arg)
at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)

有人面临同样的问题吗?感谢您的帮助。这可能与windows 10有关,但我不确定,因为我的计算机也是windows 10,但我没有收到此错误。

过去一周,我在windows 10计算机上也收到此问题。它是随机发生的,很少发生。我曾经在4台Win10机器上发生过这种情况,现在看来所有的Win7机器都还可以。出现此问题的所有用户都有多个监视器

我使用树控件,使用
虚拟化StackPanel
,树中的随机单击会导致异常

这一领域的代码已经稳定了1年多,所以奇怪的是,这种情况已经开始发生

很抱歉,我还不能提供更多帮助,因为我仍在试图自己确定原因

编辑:成功

从三月份开始,我就一直在与微软合作,最终解决了这个问题。我们已经获得了一个私人补丁,官方补丁将在2019年初通过Windows Update发布

即使在更新到2018年5月的质量汇总后,我们仍然继续经历随机崩溃。显然,有一个与RDP相关的过程正在为EVENTOBJECT_FOCUS设置WinEventThook,这导致了我们的应用程序和自动化客户端之间的断开连接,最终导致崩溃


这是一个真正的痛苦尝试,复制和钉住。非常感谢微软的支持和PG团队。

我们在我的工作中也看到了这个问题。对我们来说,这是一个赢7的盒子

看起来至少有一个人在Win 7上也有问题:

我们正在使用.NET4.6.1。我一直无法在自己的机器上重新编程,但多个同事都经历了此异常导致的崩溃

以下是来自核心转储的调用堆栈示例:

PresentationFramework.dll!System.Windows.Automation.Peers.ItemAutomationPeer.ThrowElementNotAvailableException()    Unknown
PresentationFramework.dll!System.Windows.Automation.Peers.ItemAutomationPeer.GetItemStatusCore()    Unknown
PresentationCore.dll!System.Windows.Automation.Peers.AutomationPeer.UpdateSubtree() Unknown
PresentationCore.dll!System.Windows.Automation.Peers.AutomationPeer.UpdateSubtree() Unknown
PresentationCore.dll!System.Windows.Automation.Peers.AutomationPeer.UpdatePeer(object arg)  Unknown
WindowsBase.dll!System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate callback, object args, int numArgs)  Unknown
WindowsBase.dll!System.Windows.Threading.ExceptionWrapper.TryCatchWhen(object source, System.Delegate callback, object args, int numArgs, System.Delegate catchHandler) Unknown
WindowsBase.dll!System.Windows.Threading.DispatcherOperation.InvokeImpl()   Unknown
mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx) Line 954  C#
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state, bool preserveSyncCtx) Line 902  C#
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) Line 891    C#
WindowsBase.dll!MS.Internal.CulturePreservingExecutionContext.Run(MS.Internal.CulturePreservingExecutionContext executionContext, System.Threading.ContextCallback callback, object state)  Unknown
WindowsBase.dll!System.Windows.Threading.DispatcherOperation.Invoke()   Unknown
WindowsBase.dll!System.Windows.Threading.Dispatcher.ProcessQueue()  Unknown
WindowsBase.dll!System.Windows.Threading.Dispatcher.WndProcHook(System.IntPtr hwnd, int msg, System.IntPtr wParam, System.IntPtr lParam, ref bool handled)  Unknown
WindowsBase.dll!MS.Win32.HwndWrapper.WndProc(System.IntPtr hwnd, int msg, System.IntPtr wParam, System.IntPtr lParam, ref bool handled) Unknown
WindowsBase.dll!MS.Win32.HwndSubclass.DispatcherCallbackOperation(object o) Unknown
WindowsBase.dll!System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate callback, object args, int numArgs)  Unknown
WindowsBase.dll!System.Windows.Threading.ExceptionWrapper.TryCatchWhen(object source, System.Delegate callback, object args, int numArgs, System.Delegate catchHandler) Unknown
WindowsBase.dll!System.Windows.Threading.Dispatcher.LegacyInvokeImpl(System.Windows.Threading.DispatcherPriority priority, System.TimeSpan timeout, System.Delegate method, object args, int numArgs)   Unknown
希望我们能找到解决办法

编辑:有此问题的人的更多链接:


Win7 SP1(w/.NET 4.6.1)和Win10创建者更新(.NET 4.7)系统都存在相同的问题。无法真正解释错误流程中是否存在UI自动化,因为似乎没有自动化客户端在运行

无论如何,问题与TreeView控件有关。你能确认一下吗?对于TreeViewItem实例,会创建TreeViewDataItemAutomationPeer对象(从ItemAutomationPeer派生,请参阅callstack),这是由于大量UIElement.OnIsEnableChanged()调用,我们最终会调用AutomationPeer.InvalidatePeer(),从而开始以低优先级向调度程序调用出错委托。似乎在从调度程序队列处理这些委托时,自动化树已经发生了变化,其中一个对等方的父/子关系被破坏。这就是引发异常的原因

根据框架中的注释(向上滚动一点),我将尝试以下app.config设置:

向应用程序配置文件的appSettings部分添加一个条目:

<add key="IsVirtualizingStackPanel_45Compatible" value="true"/>

问题的存在是因为正在创建automationpeer元素。PeeRelation可用于textbox、TreeView或任何其他控件。我仍然不清楚为什么会创建自动化对等元素,但我怀疑这与触摸屏设备使用“平板电脑输入服务”有关。如果您仅在触摸屏设备上遇到此问题,则可能就是这个问题

修复: 作为修复,您可以覆盖控件的(为此,您需要使用自定义控件)


您可以根据自己的需求选择创建或返回automationPeer。

MS支持部门最终发现,这是.Net Framework 4.7中引入的一个错误,在4.7.1中仍然存在(最有可能在4.7.2中)。不幸的是,在某些Windows 10版本(创建者更新及更高版本)上,您无法降级到例如4.6.2,因此您必须等待(热)修复。 (在我的另一个回答(2017年10月24日)中,我表示带有4.6.1的Win7 SP1也受到了影响,但结果证明这是一个无效的.Net Framework安装,注册表显示为4.6.1,而文件版本为4.7.xxxx。)

2018年5月18日更新:
@user1336827、@Phillip、@Rhom:我有个好消息告诉你:这个问题在2018年5月的质量汇总中得到了解决,请看这个并查找555225。

我在Windows 10上的.Net 4.5.2中看到了这个问题,当时在虚拟化的treeview上使用附加行为。我认为问题在于,您必须确保在行为中使用的treeview项必须存在,才能在行为中使用

再试试。。。catch block为我修复了这个问题,因为我只想在用户更改treeview中的选择时引发一个事件——这通常是在现有项目上作为先决条件进行的

解决这个问题的第二个更难的选择是去摆弄
ItemContainerGenerator.ContainerFromItem(node)


我不认为这是一个错误-这只是一个不太可能发生的问题-在某些情况下,只有在奇怪的时间条件下…

似乎没有帮助/我已经让我的机器升级到Windows10通过核弹和重铺。我现在可以重现这个问题,并可以在调试器中捕获它。希望能很快找到答案。你有微软承认这个错误的链接吗?我们也有这个问题,并希望监测局势。谢谢。@user1336827:我确实有一个支持票证号码,让我检查一下是否允许我与社区共享。@user1336827:我从微软那里得到了这个信息:“我们没有面向外部的错误链接。这个产品处理的组件不是完全开源的。一旦修复完成,w
ItemContainerGenerator.ContainerFromItem(node)