WinForm事件订阅另一个类

public partial class Form1 : Form { private EventThrower _Thrower; public Form1() { InitializeComponent(); } private void DoSomething() { MessageBox.Show("It worked"); } private void button1_Click(object sender, EventArgs e) { _Thrower = new EventThrower(); //using lambda expression..need to use .NET2 so can't use this. _Thrower.ThrowEvent += (sender2, args) => { DoSomething(); }; var eventThrower = new EventThrower(); eventThrower.test(); } } public class EventThrower { public delegate void EventHandler(object sender, EventArgs args); public event EventHandler ThrowEvent = delegate { }; public void SomethingHappened() { ThrowEvent(this, new EventArgs()); } public void test() { System.Threading.Thread.Sleep(1000); SomethingHappened(); } } 

我正在尝试让我的winform UI订阅EventThrower类中的事件。 DoSomething永远不会开火。

如何在c#中订阅其他类的事件?

这是因为您在调用test之前创建了一个新的EventThrower。

如果你改变:

  var eventThrower = new EventThrower(); eventThrower.test(); 

至:

  _Thrower.test(); 

它会调用DoSomething。

事件不是静态的, EventThrower 每个实例都存在一个EventHandler 实例

您在_Thrower上订阅了该事件,但您创建了一个新的EventThrower实例并在该实例上调用test() 。 您从未在该实例上订阅该事件,因此您的处理程序无法运行。

它应该是:

 _Thrower.ThrowEvent += (sender2, args) => { DoSomething(); }; _Thrower.test();