2017-10-05 73 views
3

我們有一個WPF應用程序。我們的一些客戶正在崩潰,而我無法在我的機器上重現這些信息。我可以從他們的機器上獲得的所有信息都在堆棧跟蹤下面,它只包含WPF代碼,所以我實際上無法確定應用程序中的代碼正在造成這個問題。元素不存在或虛擬化;如果支持,使用VirtualizedItem模式

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號窗口,但我沒有收到這個錯誤。

回答

1

我在過去一週還在Windows 10機器上發現了這個問題。它隨機發生,很少發生。我曾經在4臺Win10機器上出現過,現在所有的Win7機器看起來都不錯。所有有此問題的用戶都有多個顯示器。

我使用樹形控件利用VirtualizingStackPanel,樹中的隨機點擊引發異常。

這段代碼已經穩定1年了+所以奇怪的是,這已經開始發生。

對不起,我還沒有更多的幫助,因爲我仍然試圖自己確定原因。

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。我一直無法在自己的機器上覆制,但多位同事遇到此異常的崩潰。

下面是一個核心轉儲樣本調用堆棧:

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

+0

我已經通過核彈將我的機器升級到Windows 10並重新裝入。我現在可以重現該問題,並可以在調試器中捕獲它。希望能儘快找到答案。 – Phillip

2

兩者的Win7 SP1(W/.NET 4.6.1)& Win10創更新(.NET 4.7)系統同樣的問題在這裏。由於沒有自動化客戶端似乎在運行,無法真正解釋出現故障過程中的UI自動化。

無論如何,問題與TreeView控件有關。你能否證實這一點?對於TreeViewItem實例,創建TreeViewDataItemAutomationPeer對象(從ItemAutomationPeer派生,請參閱callstack),並且由於大量的UIElement.OnIsEnableChanged()調用,我們最終調用AutomationPeer.InvalidatePeer(),將BeginInvoke(s)錯誤委託傳遞給調度程序低優先級。看起來,在這些代表從調度程序隊列中被處理的時候,自動化樹已經改變,並且其中一個對等體的父/子關係被破壞。這就是拋出異常的原因。

根據框架reference source(向上滾動一下)的評論,我會嘗試下面的應用程序。配置設置:

添加一個條目的appSettings應用程序配置文件的部分:因爲的AutomationPeer元素

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

似乎沒有幫助。 :/ – Phillip

0

問題存在被建立。 Peerelements可以用於文本框,treeviewitem或任何其他控件。我仍然不確定爲什麼創建自動化對等元素,但我懷疑這與觸摸屏設備使用「Tablet PC輸入服務」有關。如果您只在觸摸屏設備上遇到此問題,可能就是這樣。

FIX: 作爲一個修復你可以覆蓋的控制(對,你需要使用自定義控制)

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

您可以根據您的需要選擇創建或返回的AutomationPeer 。

2

MS支持終於發現這是一個在.Net Framework 4.7中引入的bug,並且仍然存在於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。)

+0

你有鏈接到微軟承認這個錯誤?我們也有這個問題,並希望監測情況。謝謝。 – user1336827

+0

@ user1336827:我確實有一個支持票號,讓我檢查是否允許我與社區分享。 – tanis83

+0

@ user1336827:我從MS那裏得到了這樣的信息:「我們沒有面向外部的bug鏈接,這個產品處理的不是完全開源的組件,一旦修復完成,我們將有一個kb共享。 「 – tanis83

相關問題