2011-06-17 15 views
6

Tengo un proyecto que funcionaba bien en .NET 3.5 SP1. Ahora, al actualizar a .NET 4.0, tengo una excepción de Automatización..NET 4.0 WPF Excepción de automatización

He buscado todo mi proyecto para todo lo relacionado con Automatización y no hay nada que ver con Automatización. Además, una búsqueda en Google no ayuda a confirmar si se trata de un error. El error solo ocurre en algunas PC y ocurre al azar. Es posible deshabilitar por completo la automatización, ya que creo que podría ser un error de .NET 4.0.

Exception Source: PresentationCore 
Message: Object reference not set to an instance of an object. 
Stack Trace: 
    at System.Windows.Automation.Peers.AutomationPeer.EnsureChildren() 
    at System.Windows.Automation.Peers.AutomationPeer.UpdateChildrenInternal(Int32 invalidateLimit) 
    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 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 
    at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Int32 numArgs, Delegate catchHandler) 
    at System.Windows.Threading.DispatcherOperation.InvokeImpl() 
    at System.Threading.ExecutionContext.runTryCode(Object userData) 
    at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Windows.Threading.DispatcherOperation.Invoke() 
    at System.Windows.Threading.Dispatcher.ProcessQueue() 
    at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
    at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
    at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) 
    at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) 
    at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) 
    at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Int32 numArgs, Delegate catchHandler) 
    at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs) 
    at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) 
    at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) 
    at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) 
    at System.Windows.Application.RunInternal(Window window) 
    at System.Windows.Application.Run() 
+0

no sé la respuesta, pero sugiero que siga observando. si el problema es realmente aleatorio, entonces podría ser un error de .net 4.0. de lo contrario no es –

+0

Tuvimos el mismo problema, desapareció cuando eliminé parte del estilo. Cuando descubramos exactamente qué parte lo causó, lo escribiré aquí. – sinelaw

+0

Ok, en nuestro caso tenía que ver con una animación del guión gráfico en el estilo del calendario de un selector de fecha y hora. Todavía no investigamos la causa exacta, pero eliminaremos las animaciones a medida que lo solucione. – sinelaw

Respuesta

5

El método EnsureChildren es bastante simple:

private void EnsureChildren() 
{ 
    if (!this._childrenValid || this._ancestorsInvalid) 
    { 
     this._children = this.GetChildrenCore(); 
     if (this._children != null) 
     { 
      int count = this._children.Count; 
      for (int i = 0; i < count; i++) 
      { 
       this._children[i]._parent = this; 
       this._children[i]._index = i; 
       this._children[i]._hwnd = this._hwnd; 
      } 
     } 
     this._childrenValid = true; 
    } 
} 

La única posibilidad para una NullReferenceException es con el código this.children[i]. El GetChildrenCore generalmente es implementado por los compañeros de automatización para controles WPF personalizados. Entonces, es probable que una de ellas sea nula en la colección devuelta por GetChildrenCore.

Si tiene controles personalizados o controles de terceros que implementen un par de automatización personalizado, entonces sería un posible sospechoso.

Puede deshabilitar la automatización de UI elemento por elemento creando una clase personalizada y reemplazando OnCreateAutomationPeer y devolviendo nulo. Esa es la única forma que conozco de desactivar la automatización.

Probablemente su mejor opción sea eliminar varios elementos de su IU para reducir el control que causa el problema.

+0

¡Gracias! Bueno, tengo el código fuente para todos los controles personalizados, etc.Nada parece estar implementando un par de automatización personalizado. Voy a intentar anular el OnCreateAutomationPeer para todas las ventanas del proyecto. – Luke

+0

@Luke: ¿Podrías resolver el problema de alguna manera? De ser así, ¿podría proporcionarnos alguna información sobre lo que hizo como respuesta, por favor? Actualmente estamos atrapados con el mismo problema. –

0

Ésta es WPF fallo. CalendarAutomationPeer.GetChildrenCore devuelve nulos si no hay una plantilla de datos definida para la fila Título del día (la parte del calendario que muestra el nombre de los días). Esto provoca excepciones de puntero nulo que generalmente se manejan en algún lugar de WPF pero a veces hacen que una aplicación se cuelgue.

Para resolver esto simplemente defina DayTitleTemplate (como se menciona en el comentario de Friggers y en esta publicación How can I change the DataTemplate for DayTitleTemplate in a CalendarItemTemplate).