Использование пользовательского RoutedEvent в WPF вызывает исключение TargetInvocationException

#wpf #routed-events

#wpf #маршрутизируемые события

Вопрос:

Я пробую пользовательские маршрутизируемые события, но получаю TargetInvocationException при компиляции с подключенным обработчиком событий.

У меня есть следующий код внутри пользовательского элемента управления EventRaiserControl :

 public static readonly RoutedEvent KickedEvent = EventManager.RegisterRoutedEvent("KickedEvent", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(EventRaiserControl));

public event RoutedEventHandler Kicked
{
    add
    { this.AddHandler(KickedEvent, value); }

    remove
    { this.RemoveHandler(KickedEvent, value); }
}

private void btn1_Click(object sender, RoutedEventArgs e)
{
    RaiseEvent(new RoutedEventArgs(KickedEvent));
}
  

Затем в моем главном окне появляется следующий XAML:

 <StackPanel local:EventRaiserControl.Kicked="StackPanel_Kicked">
    <local:EventRaiserControl Kicked="EventRaiserControl_Kicked"/>
</StackPanel>
  

Со следующими обработчиками в коде MainWindow:

 private void StackPanel_Kicked(object sender, RoutedEventArgs e)
{
    Console.WriteLine("Caught Kicked Event at Panel level.");
}

private void EventRaiserControl_Kicked(object sender, RoutedEventArgs e)
{
    Console.WriteLine("Caught Kicked Event at Control level.");
}
  

Мой код отлично работает с этим обработчиком:

 <local:EventRaiserControl Kicked="EventRaiserControl_Kicked"/>
  

Но сбой происходит с TargetInvocationException момента добавления подключенного обработчика:

 <StackPanel local:EventRaiserControl.Kicked="StackPanel_Kicked">
  

Кто-нибудь может помочь? Что я упускаю / неправильно использую?

Большое спасибо

Комментарии:

1. Является InnerException ли из TargetInvocationException набора? Обычно TargetInvocationException это оборачивает реальную проблему.

2. Мои извинения, @CodeNaked, вы, конечно, правы. Это InnerException «Ссылка на объект, не установленная для экземпляра объекта».

Ответ №1:

Сначала я был удивлен, почему это так, но я увидел причину после кодирования в виде вашего кода. Просто измените

 EventManager.RegisterRoutedEvent("KickedEvent"....
  

Для

 EventManager.RegisterRoutedEvent("Kicked"....
  

Комментарии:

1. Большое спасибо, это было именно так. Мне часто трудно отлаживать подобные ошибки WPF — код часто компилируется, и ошибка времени выполнения редко бывает для меня информативной. Вы сразу обнаружили ошибку, просмотрев код, или ошибка во время выполнения каким-то образом привела вас к ней?

2. О, у меня нет лучшего способа, чем просто проверять сообщения об исключениях. Извините, что не дал хорошей идеи. Это тоже было очень сложно для меня.