gpt4 book ai didi

wpf - 来自 PresentationFramework.dll 的 NullReferenceException

转载 作者:行者123 更新时间:2023-12-03 22:19:04 32 4
gpt4 key购买 nike

我正在与一个奇怪的 NullReferenceException 作斗争,它显然是从 GetNameCore() 触发的ItemAutomationPeer的功能类(class)。

异常的详细信息如下,但真正有趣的方面是它不会发生在我运行 Windows 7 的开发机器或我们测试过的其他 Windows 7 计算机上。它只发生在我的 Windows 8 Pro 测试机上。

尝试编辑 WPF DataGrid 控件中的单元格时显然会引发异常。

我一整天都在试图追踪它,但没有成功。我尝试使用 Visual Studio 远程调试该过程并逐步执行代码,但似乎没有任何用户代码触发异常。它显然是由 PresentationFramework.Dll 内的一系列事件执行的,异常只是通过 AppDomain 冒泡并最终使应用程序崩溃。

如果有人能想到可能导致这种情况的任何事情,或解决它的方法,那真的会有所帮助。

Exception Type:         System.NullReferenceException
Exception Message: Object reference not set to an instance of an object.
Method Information: System.String GetNameCore()
Exception Source: PresentationFramework

Stack Trace
at System.Windows.Automation.Peers.ItemAutomationPeer.GetNameCore()
at System.Windows.Automation.Peers.AutomationPeer.UpdateSubtree()
at System.Windows.Automation.Peers.AutomationPeer.UpdateSubtree()
at System.Windows.Automation.Peers.AutomationPeer.UpdateSubtree()
at System.Windows.ContextLayoutManager.fireAutomationEvents()
at System.Windows.ContextLayoutManager.UpdateLayout()
at System.Windows.ContextLayoutManager.UpdateLayoutCallback(Object arg)
at System.Windows.Media.MediaContext.InvokeOnRenderCallback.DoWork()
at System.Windows.Media.MediaContext.FireInvokeOnRenderCallbacks()
at System.Windows.Media.MediaContext.RenderMessageHandlerCore(Object resizedCompositionTarget)
at System.Windows.Media.MediaContext.AnimatedRenderMessageHandler(Object resizedCompositionTarget)
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.DispatcherOperation.InvokeImpl()
at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
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.LegacyInvokeImpl(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.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
at System.Windows.Threading.Dispatcher.Run()
at System.Windows.Application.RunDispatcher(Object ignore)
at System.Windows.Application.RunInternal(Window window)
at System.Windows.Application.Run(Window window)
at System.Windows.Application.Run()

最佳答案

经过与远程调试器的多次反复和几乎毫无结果的在线搜索后,我能够将问题追溯到几个错误行为 ItemAutomationPeer实例。

当我遇到这个问题时,我对 UI 自动化以及 WPF 框架如何支持它的了解为零。事实上,当 AutomationPeer 出于某种原因让我考虑 COM 互操作时,所以我追了一段时间错误的问题。如果您正在阅读本文并且不知道 UI 自动化可能正在启动 herehere可能会让您了解 UI 自动化在 WPF 上下文中的含义。

就我而言,结果证明应用程序在 Windows 8 测试机器上崩溃但在我的开发机器(以及它已部署到的无数其他计算机)上运行良好的原因是 Windows 8 机器有一些正在运行的某种 UI 辅助功能应用程序(或其他一些 UI 自动化客户端)。一旦我在我的 Windows 7 开发机器上启动讲述人应用程序,我就能够让应用程序崩溃。

一旦我理解了根本问题,我仍然无法进一步调试以找出导致问题的确切控件,但更多在线阅读似乎指向自定义控件的大方向,因此我开始了一个消除过程以确定哪个控件自定义 WPF 控件是有罪的。我找到了两个自定义控件 - 一个扩展了 DataGrid,另一个扩展了 ListBox。

最后,我的问题的解决方案是创建扩展 ItemsControlAutomationPeer 的自定义类。基类,并通过覆盖 OnCreateAutomationPeer 将它们提供为每个有问题的自定义控件的自动化对等项。方法。

protected override AutomationPeer OnCreateAutomationPeer()
{
return new ControlSpecificCustomAutomationPeer(this);
}

ControlSpecificCustomAutomationPeer 类至少看起来像这样:
public class ControlSpecificCustomAutomationPeer
: ItemsControlAutomationPeer
{
public ControlSpecificCustomAutomationPeer(ItemsControl owner)
: base(owner)
{
}

protected override string GetNameCore()
{
return ""; // return something meaningful here..
}

protected override ItemAutomationPeer CreateItemAutomationPeer(object item)
{
return new CustomDummyItemAutomationPeer(item, this);
}
}

public class CustomDummyItemAutomationPeer
: System.Windows.Automation.Peers.ItemAutomationPeer
{
public CustomDummyItemAutomationPeer(object item, ItemsControlAutomationPeer itemsControlAutomationPeer)
: base(item, itemsControlAutomationPeer)
{
}

protected override string GetNameCore()
{
if (Item == null)
return "";

return Item.ToString() ?? "";
}

protected override AutomationControlType GetAutomationControlTypeCore()
{
return System.Windows.Automation.Peers.AutomationControlType.Text;
}

protected override string GetClassNameCore()
{
return "Dummy";
}
}

关于wpf - 来自 PresentationFramework.dll 的 NullReferenceException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16245732/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com