#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. О, у меня нет лучшего способа, чем просто проверять сообщения об исключениях. Извините, что не дал хорошей идеи. Это тоже было очень сложно для меня.