我试图根据我从Node.js API获得的JSON响应,在命名的StackPanel中动态添加按钮。我将这个JSON数组解析为一个对象数组,该对象具有将所有属性放在适当位置的类。然后,在foreach中,我想使用我放在对象数组中的信息来构建按钮。请注意,对象数组包含良好的属性。如果我尝试在我的foreach中简单地执行MessageBox.Show(item.name)
,它将显示我所有对象的所有名称。没有值为null,我检查了三次。
以下是我创建按钮的方法:
ItemList[] items = JsonConvert.DeserializeObject<ItemList[]>(jsonString);
Dispatcher.BeginInvoke(new Action(() =>
{
foreach (ItemList item in items)
{
Button ItemName = new Button();
//defining properties of the button, like width, etc..
ItemName.Content = item.title;
ItemName.Name = item.id;
//Will add Click event.
ItemPanel.Children.Add(ItemName);
}
}));
尝试时,我得到一个TargetInvocationException:
[System.Reflection.TargetInvocationException {System.Reflection.TargetInvocationException:调用目标抛出了异常。 ---&GT; System.NullReferenceException:未将对象引用设置为对象的实例。
为什么?神秘。我试着创建按钮对象并将其添加到我的StackPanel中而不做任何其他事情,并且错误是相同的。
我做错了什么?如何摆脱这个?我已经在另一个应用程序中创建了这样的动态元素,而且这样做了。
函数创建按钮在函数末尾调用,该函数使用HTTP请求从api获取JSON。在OnNavigatedTo方法中调用HTTP请求函数(是的,这很奇怪,但这是我发现在到达页面时自动调用函数的唯一方法,使用来自OnNavigatedTo方法的变量.I在其他页面上做过,并且它正在工作(虽然它不是创建按钮,只是修改现有的文本块)。
这里有完整的错误:
System.Reflection.TargetInvocationException:
Exception has been thrown by the target of an invocation. --->
System.NullReferenceException: Object reference not set to an instance of an object.
at CubbyHole_Mobile.BrowseFiles.<>c__DisplayClass1.b__0()
--- End of inner exception stack trace ---
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
at System.Reflection.RuntimeMethodInfo.UnsafeInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Delegate.DynamicInvokeImpl(Object[] args)
at System.Windows.Threading.DispatcherOperation.Invoke()
这是堆栈跟踪:
CubbyHole Mobile.DLL!CubbyHole_Mobile.App.Application_UnhandledException(object sender, System.Windows.ApplicationUnhandledExceptionEventArgs e) Ligne 100 C#
System.Windows.ni.dll!MS.Internal.Error.CallApplicationUEHandler(System.Exception e) Inconnu
System.Windows.ni.dll!MS.Internal.Error.IsNonRecoverableUserException(System.Exception ex, out uint xresultValue) Inconnu
System.Windows.ni.dll!System.Windows.Threading.DispatcherOperation.Invoke() Inconnu
System.Windows.ni.dll!System.Windows.Threading.Dispatcher.Dispatch(System.Windows.Threading.DispatcherPriority priority) Inconnu
System.Windows.ni.dll!System.Windows.Threading.Dispatcher.OnInvoke(object context) Inconnu
System.Windows.ni.dll!System.Windows.Hosting.CallbackCookie.Invoke(object[] args) Inconnu
System.Windows.RuntimeHost.ni.dll!System.Windows.RuntimeHost.ManagedHost.InvokeDelegate(System.IntPtr pHandle, int nParamCount, System.Windows.Hosting.NativeMethods.ScriptParam* pParams, System.Windows.Hosting.NativeMethods.ScriptParam* pResult) Inconnu
(对不起,法国VS,但应该是可读的)
此外,尝试将新创建的项添加到现有StackPanel时会引发错误,但不会在该行上停止。它转到UnhandledException方法中的app.xaml.cs,然后使用Debugger.Break()停止; (就像我在处理这个问题时遇到的几乎所有错误一样)。
答案 0 :(得分:13)
好的..我刚想通了。那不是代码错误。一点也不。好吧,实际上不是我的代码。
厌倦了徒劳的尝试,我保存并关闭了Visual Studio以休息一下。然后我回来了..它的确有效。没有任何接触。尝试修改我的代码十几次后,重新生成整个解决方案几次,最后通过重新启动VS解决了自己?上帝,我讨厌那种事情......因为有一天我会变得疯狂。
好的,谢谢大家的回复!
答案 1 :(得分:1)
您确定ItemPanel
是否为空?如果所有内容都在.Children.Add()
崩溃,那么这是最有可能发生的情况。