#vb.net #events #plugins #event-handling
#vb.net #Мероприятия #Плагины #обработка событий
Вопрос:
Я пытаюсь создать возможности плагина для своего приложения. Как вы добавляете событие к функции, которая преобразует событие в другой тип события. Например, класс плагина содержит Sub и событие следующим образом:
Structure ClickedEventArgs
property ClickedTime As DateTime
property Clicked As Boolean
End structure
Sub Clicked(sender As object, e As ClickedEventArgs)
RaiseEvent Clicked(Sender, e)
End sub
Sub PluginLoaded
AddHandle ClickObject.Clicked, AddressOf NewObject.Clicked
End Sub
newObject является ссылкой и может обрабатывать события только со следующей структурой (например, как NewObjectEventArgs), и поэтому они не могут быть обработаны AddHandled, поскольку подписи не совпадают.
Structure NewObjectEventArgs
Property Clicked As Boolean
Property ClickedTime As DateTime
Property otherInfo As Object
End Structure
Как мне преобразовать ClickedEventArgs в NewObjectEventArgs и AddHandle их?
Использую ли я функцию? и если да, то как мне это сделать?
Комментарии:
1. оба аргумента события должны быть классами, а не структурами, и CA понравится, если они наследуются от EventArgs. вы пытаетесь «отправить» событие, то есть перехватить A, а затем выбросить B для использования чего-то еще? Я не понимаю, что вы пытаетесь сказать … newObject просто появился в вашем сообщении из ниоткуда. Есть ли какая-либо причина, по которой вы не можете использовать правильную подпись?
2. API плагина позволяет отправлять команды в основное приложение через вспомогательный модуль, который вызывает событие. Приложение обрабатывает объект и соответствующим образом обновляет интерфейс. Интерфейс использует ссылочный компонент DevExpress. Требования компонента (отправитель как объект, e как itemclickeventargs) Я хотел бы преобразовать свой собственный интерфейс и заполнить значения в новый itemclickeventargs, который будет отправлен на событие. Пожалуйста, помогите, если можете, спасибо.
3. все еще не знаю, что такое newObject, и теперь есть пользовательский компонент. Возможно, вы могли бы подклассировать эту вещь и создать свое собственное событие. В противном случае подпишитесь на него и отправьте новое событие, как описывает Марк, вы не сможете преобразовать события или аргументы событий, поскольку подпись должна оставаться неизменной, чтобы они работали.
Ответ №1:
Вам нужно будет обрабатывать события и пересылать их в NewObject
:
Sub PluginLoaded()
AddHandler ClickObject.Clicked,
Sub(sender, e)
NewObject.Clicked(
sender,
New NewObjectEventArgs() With {
.Clicked = e.Clicked,
.ClickedTime = e.ClickedTime,
.otherInfo = ??? ' leave null, or populate somehow
}
)
End Sub
End Sub
Если в какой-то момент вам нужно удалить обработчик, вам следует создать отдельную подпрограмму вместо использования лямбда-выражения (или вы можете сделать это так, как вам больше нравится):
Sub ClickObject_Clicked(sender As Object, e As ClickedEventArgs)
' Same code as above
End Sub