Исключение автоматизации .NET 4.0 WPF - PullRequest
7 голосов
/ 17 июня 2011

У меня есть проект, который работал нормально в .NET 3.5 SP1.Теперь при обновлении до .NET 4.0 у меня возникает исключение автоматизации.

Я искал весь свой проект на предмет чего-либо, связанного с автоматизацией, и ничего общего с автоматизацией не имеет.Кроме того, поиск в Google не помогает с подтверждением, если это ошибка.Ошибка возникает только на нескольких компьютерах и происходит случайно.Можно полностью отключить автоматизацию, так как я думаю, что это может быть ошибка .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()

Ответы [ 3 ]

5 голосов
/ 17 июня 2011

Метод EnsureChildren довольно прост:

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;
    }
}

Единственный шанс для NullReferenceException - с кодом this.children[i]. GetChildrenCore обычно реализуется узлами автоматизации для пользовательских элементов управления WPF. Так что, скорее всего, одним из них будет возвращение нулевого значения в коллекции, возвращаемой из GetChildrenCore.

Если у вас есть пользовательские элементы управления или сторонние элементы управления, которые реализуют пользовательский одноранговый узел автоматизации, то это может быть подозрительным.

Вы можете отключить автоматизацию пользовательского интерфейса для каждого элемента путем создания пользовательского класса и переопределения OnCreateAutomationPeer и возврата нуля. Это единственный известный мне способ отключить автоматизацию.

Лучше всего, вероятно, было бы удалить различные элементы вашего пользовательского интерфейса, чтобы определить, какой элемент управления вызывает проблему.

1 голос
/ 27 октября 2011

У меня была похожая проблема, и мне помог следующий поток: http://social.msdn.microsoft.com/Forums/ar/wpf/thread/0ee9954d-0df5-4d61-8dc9-eb50c7a5be99.

Измените DataTemplate с "DayTitleTemplate" на "{x: Static CalendarItem.DayTitleTemplateResourceKey}"

0 голосов
/ 14 ноября 2012

Это ошибка WPF. CalendarAutomationPeer.GetChildrenCore возвращает нули, если для строки названия дня не определен шаблон данных (часть календаря, в которой отображается название дня). Это приводит к исключениям нулевого указателя, которые обычно обрабатываются где-то в WPF, но иногда вызывают сбой приложения.

Чтобы решить эту проблему, просто определите DayTitleTemplate (как упомянуто в комментарии Friggers и в этом посте Как я могу изменить DataTemplate для DayTitleTemplate в CalendarItemTemplate ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...