PresentationFramework.dll中发生’System.Reflection.TargetInvocationException’

好的,我有点奇怪的错误……

这很好用:

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

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

事件可能在元素完全加载或引用仍未设置之前引发,因此例外。 如果引用不为nullIsLoadedtrue则仅尝试设置属性。

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

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

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

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

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

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

通过检查null可以很容易地解决这个问题:

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

如果在完全加载窗口的内容之前发生无线电按钮检查事件,即完全加载椭圆,则将抛出这种exception。 因此,检查是否加载了窗口的UI(可能是Window_ContentRendered事件等)。