元素不存在或虚拟化;如果支持,请使用VirtualizedItem Pattern

时间:2017-10-05 14:11:20

标签: c# .net wpf windows

我们有一个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有关,但我不确定,因为我的机器也是窗口10,但我没有收到此错误。

6 个答案:

答案 0 :(得分:3)

与Win7 SP1(w / .NET 4.6.1)和&amp ;; Win10 Creators Update(.NET 4.7)系统。无法真正解释故障过程中UI自动化的存在,因为似乎没有自动化客户端正在运行。

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

根据框架reference source的评论(稍微向上滚动),我会尝试以下app.config设置:

在应用配置文件的 appSettings 部分添加条目:

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

答案 1 :(得分:3)

MS支持终于发现这是.Net Framework 4.7中引入的一个错误,并且仍然存在于4.7.1中(最有可能在4.7.2中)。不幸的是,在某些Windows 10版本(Creators Update及更高版本)上,您无法降级到例如4.6.2,所以你必须等待(热)修复。 (在我的另一个答案(2017年10月24日)中,我说Win7 SP1和4.6.1也受到影响,但结果是无效的.Net Framework安装,其中注册表显示4.6.1与文件形成对比版本为4.7.xxxx。)

更新05/18/2018: @ user1336827,@ Pipip,@ Rhom:我有个好消息:这个问题已在2018年5月的质量汇总中得到解决,请参阅此link并查找555225。

答案 2 :(得分:1)

过去一周我在Windows 10机器上也遇到过这个问题。它随机发生,很少发生。我有它发生在4 x Win10机器上,所有Win7盒子现在似乎都很好。遇到此问题的所有用户都有多个监视器。

我使用VirtualizingStackPanel的树控件,树中的随机点击导致异常。

这段代码已经稳定了1年+所以奇怪的是这已经开始发生了。

对不起,我还没有更多的帮助,因为我仍在努力确定原因。

编辑:成功!

自3月以来,我一直在与微软合作,最终解决了这个问题。我们已获得私人修复,官方修复将在2019年初通过Windows Update推出。

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

尝试复制和钉牢是一种真正的痛苦。非常感谢MS支持和PG团队。

答案 3 :(得分:1)

我们在工作中也看到了这个问题。它发生在我们的Win 7盒子上。

看起来至少还有一个人在Win 7上遇到了问题:https://social.msdn.microsoft.com/Forums/fr-FR/b7087dc1-3943-4623-bc47-1c1e5021e12f/wpf-application-crashing-after-windows-update-element-does-not-exist-or-it-is-virtualized

我们正在使用.NET 4.6.1。我一直无法在我自己的机器上进行复制,但多个同事一直在遇到此例外的崩溃。

以下是来自核心转储的示例callstack:

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

希望我们能找到解决方案。

修改:有关此问题的人的更多链接:

https://forums.tripwireinteractive.com/forum/killing-floor-2/killing-floor-2-modifications/level-design-ac/2292222-sdk-crash-when-loading-packages-after-win-10-update

答案 4 :(得分:0)

由于正在创建automationpeer元素,因此存在问题。 Peerelements可以用于文本框,treeviewitem或任何其他控件。我仍然不确定为什么自动化对等元素被创建但我怀疑这与触摸屏设备使用&#34;平板电脑输入服务&#34; 。如果您只是在触摸屏设备上遇到此问题,可能就是这样。

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

 protected override AutomationPeer OnCreateAutomationPeer(for this )
    {
        AutomationPeer automationPeer = null;           
        automationPeer = base.OnCreateAutomationPeer();            
        return automationPeer;
    }

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

答案 5 :(得分:0)

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

另一个try ... catch块为我解决了这个问题,因为如果用户在树视图中更改了选择,我想只引发一个事件 - 这通常是作为先决条件在现有项目上完成的。

解决这个问题的第二个更难的选择就是去挑战

ItemContainerGenerator.ContainerFromItem(node)

我不认为这是一个错误 - 它只是一个非常不可能发生的问题 - 在某些情况下只在奇数时间条件下......