如何在C++/CLI中为事件分配事件处理程序?

lit*_*tuk 6 .net c# events c++-cli event-handling

如何将"事件"添加到"事件"/委托?语法是什么?它在C++/CLI和C#中是一样的吗?

Ric*_*bob 12

1:如果事件的underlyng delgate是自定义的,那么你定义自己是一个类memeber(来自MSDN的例子):

delegate void Del(int, float);
ref class EventReceiver {
public:
    void Handler(int i , float f) {  }
};
myEventSource->MyEvent += gcnew Del(myEventReceiver, &EventReceiver::Handler);
Run Code Online (Sandbox Code Playgroud)

2:如果底层委托是全局处理程序并且具有.NET事件的标准签名(对象+事件args)(来自DPD答案):

delegate void MyOwnEventHandler(Object^ sender, EventArgs^ e) { }  
myEventSource->MyEvent += gcnew EventHandler(MyOwnEventHandler);  
Run Code Online (Sandbox Code Playgroud)

3:如果底层委托具有.NET事件的标准签名,并且事件处理程序是类方法:

ref class EventReceiver {
public:
   void Handler(Object^ sender, EventArgs^ e) {  }
};
myEventSource->MyEvent += gcnew EventHandler(myEventReceiver, &EventReceiver::Handler);
Run Code Online (Sandbox Code Playgroud)

4:使用System :: EventHandler泛型(它采用MyEventArgs args参数)作为底层委托:

ref class EventReceiver {
public:
   void Handler(Object^ sender, MyEventArgs^ e) {  }
};
myEventSource->MyEvent += gcnew EventHandler<MyEventArgs^>(this, &EventReceiver::DataReceived);
Run Code Online (Sandbox Code Playgroud)


Mat*_*zer 11

,您可以使用+=运算符:

someObj.SomeEvent += new EventHandler(Blah_SomeEvent);
Run Code Online (Sandbox Code Playgroud)

...

private void Blah_SomeEvent(object sender, EventArgs e)
{
}
Run Code Online (Sandbox Code Playgroud)

更比一岁以后编辑

我发布这个答案已经很久了,有人注意到我可能是错的.我真的不知道为什么OP标记我的答案是正确的(也许OP正在寻找这个而不是语法?现在谁知道).

无论如何,在它将是:

someObj->SomeEvent+= gcnew EventHandler(this, &Blah_SomeEvent);
Run Code Online (Sandbox Code Playgroud)

  • @dacap也许你应该拒绝这个问题。如果我错误地认为 OP 寻找 C# 语法,那应该是问题问错了。谁知道为什么 OP 检查我的答案是正确的。无论如何,似乎OP发现它很有用。 (2认同)

DPD*_*DPD 6

C++/CLI的语法是:

delegate void MyOwnEventHandler(Object^ sender, Eventargs^ e)
{

}
Run Code Online (Sandbox Code Playgroud)

为此活动注册:

objectPtr->MyEvent += gcnew EventHandler(MyOwnEventHandler);
Run Code Online (Sandbox Code Playgroud)