【问题标题】:'System.Reflection.TargetInvocationException' occurred in PresentationFramework.dllPresentationFramework.dll 中发生“System.Reflection.TargetInvocationException”
【发布时间】:2012-08-28 17:30:49
【问题描述】:

好吧,我有一个奇怪的错误...

这很好用:

private void radioButtonNormalPoint_Checked(object sender, RoutedEventArgs e)
{
   //comboBoxNormalPoint.SelectedIndex = 0;
   //ellipsePoint.Fill = System.Windows.Media.Brushes.Black;
}

这会抛出System.Reflection.TargetInvocationException:

private void radioButtonNormalPoint_Checked(object sender, RoutedEventArgs e)
{
   comboBoxNormalPoint.SelectedIndex = 0;
   ellipsePoint.Fill = System.Windows.Media.Brushes.Black;
}

另外,它不允许我调试它;它在程序加载时崩溃。如果我在没有命中它的任何地方放置一个断点;它只是立即出错。

【问题讨论】:

  • 记录 InnerException 和堆栈跟踪。
  • 你必须注释掉这两行,对吧?还是仅在第一行发生崩溃?选定索引=0。
  • 它是任何行(即使我只是声明一个变量 int i = 0; 也没关系)并且内部异常为 null 但在弹出的未处理异常中(因为我不能抓住它)它说附加信息:调用的目标已引发异常。
  • 可能是事件处理程序连接。告诉我你在哪里挂钩事件。如果可能,请在代码隐藏中进行

标签: c# .net wpf


【解决方案1】:

该事件可能在元素完全加载或引用仍未设置之前引发,因此存在异常。如果引用不是null 并且IsLoadedtrue,请尝试仅设置属性。

【讨论】:

  • 该错误是因为单选按钮在加载时已被选中,并尝试为尚未加载的combobox.selectedindex分配一个值
  • @JustinKirk:正如我所料:)
  • 在我的例子中,我复制并粘贴了一个文本框,其中一个函数触发 TextChanged 引用自身。我忘记更改第二个框的函数目标,所以它死了,发现另一个文本框仍然为空。
【解决方案2】:

要诊断此问题,请将导致 TargetInvocationException 的代码行放在 try 块内。

要解决此类错误,请获取内部异常。这可能是由于许多不同的问题造成的。

try
{
    // code causing TargetInvocationException
}
catch (Exception e)
{
    if (e.InnerException != null)
    {
    string err = e.InnerException.Message;
    }
}

【讨论】:

    【解决方案3】:

    我认为,如果您声明一个实现 INotifyPropertyChanged 的​​属性,然后将数据绑定 IsCheckedSelectedIndex(使用 IValueConverter)和 Fill(使用 IValueConverter),而不是使用 Checked Event 来切换,我认为您会遇到更少的问题SelectedIndexFill

    【讨论】:

      【解决方案4】:

      这通常是由试图处理空对象引起的。 例如,尝试清空一个为 null 的 Bindable 列表将触发异常:

      public class MyViewModel {
          [BindableProperty]
          public virtual IList<Products> ProductsList{ get; set; }
      
          public MyViewModel ()
          {
              ProductsList.Clear(); // here is the problem
          }
      }
      

      这可以通过检查 null 来轻松解决:

      if (ProductsList!= null) ProductsList.Clear();
      

      【讨论】:

        【解决方案5】:

        如果单选按钮检查事件发生在窗口内容完全加载之前,即椭圆已完全加载,则会抛出此类异常。所以检查窗口的UI是否被加载(可能是通过Window_ContentRendered事件等)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-02-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多