"System.Reflection.TargetInvocationException" 在 PresentationFramework.dll 中发生

35

好的,我有一个有点奇怪的bug...

这个工作正常:

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

而且,它不让我调试它;程序载入时就会崩溃。如果我在任何地方设置断点,它都不会命中它; 它会立即出错。


3
记录InnerException和堆栈跟踪。 - Hans Passant
你需要注释掉这两行代码,对吗?还是说只有第一行会导致崩溃?SelectedIndex=0。 - Erti-Chris Eelmaa
这是任何行(即使我只声明一个变量int i = 0;),内部异常为null,但在弹出的未处理异常中(因为我无法捕获它),它说“附加信息:异常已被调用目标抛出”。 - user1200540
可能是事件处理程序的挂钩。请告诉我您在哪里挂接事件。如果可能,请在代码后端完成。 - Erti-Chris Eelmaa
<RadioButton Content="Normal Point:" Grid.ColumnSpan="2" Height="16" HorizontalAlignment="Left" Margin="29,143,0,0" Name="radioButtonNormalPoint" VerticalAlignment="Top" Width="103" IsChecked="True" GroupName="a" Checked="radioButtonNormalPoint_Checked" /> - user1200540
虽然已经晚了2年,但是在这种情况下,我发现当异常被抛出时,立即中断非常重要。例如:DEBUG>Exceptions> "Break when an exception is:"> Thrown (适用于公共语言运行时异常)。 - darkpbj
5个回答

35

很可能在元素完全加载之前或引用仍未设置的情况下就已经触发了事件,因此会出现异常。请仅在引用不为nullIsLoadedtrue时设置属性。


1
该错误是由于单选按钮在加载时已被选中,并尝试为未加载的组合框值分配一个索引,所以导致的。 - user1200540
@JustinKirk:正如我所预料的一样 :) - H.B.
在我的情况下,我复制并粘贴了一个带有触发函数的文本框,该函数引用自身的TextChanged事件。我忘记为第二个文本框更改函数的目标,因此它无法正常工作,因为它找不到其他文本框仍为空。 - kpierce8

6
为了诊断这个问题,请将导致TargetInvocationException的代码行放入try块中。
要解决这种类型的错误,请获取内部异常。可能是由许多不同的问题引起的。
try
{
    // code causing TargetInvocationException
}
catch (Exception e)
{
    if (e.InnerException != null)
    {
    string err = e.InnerException.Message;
    }
}

0
如果单选按钮选中事件在窗口内容完全加载(即椭圆形状完全加载)之前发生,将会抛出异常。因此,请检查窗口的 UI 是否已加载(可能是通过 Window_ContentRendered 事件等)。

0

我认为如果您声明一个实现了INotifyPropertyChanged的属性,然后将IsCheckedSelectedIndex(使用IValueConverter),以及Fill(使用IValueConverter)数据绑定到它,而不是使用Checked事件来切换SelectedIndexFill,那么您就会遇到更少的问题。


0

这通常是由于尝试处理空对象引起的。

例如,尝试清空一个为空的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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接