在C#中编写全局自定义事件

我在这个窗体上有一个winform winform1和2个用户控件control1control2

现在我想定义一个自定义事件 ,它在control1中被引发/触发并在control2中被接收。 该事件应该是全局的,而不是在control1中直接定义。 control2不应该知道control1的存在。 该事件也应由其他控件提出。 C#代码怎么样? 我需要像发布者类这样的东西吗?

您可以使用静态事件:

public static class MyGlobalEvent { public static event EventHandler MyEvent; public static void FireMyEvent(EventArgs args) { var evt = MyEvent; if (evt != null) evt(args); } } 

以通常的方式订阅:

 MyGlobalEvent.MyEvent += args => Console.WriteLine("Event Was Fired."); 

你认为合适的火:

 MyGlobalEvent.FireMyEvent(new EventArgs()); 

您描述的内容类似于Mediator模式 ,其中对象通过消息进行通信。 这些消息可以实现为事件,回调或任何其他机制。

您可以使用像MVVM Light的Messenger类这样的实现(此框架旨在与WPF和Silverlight一起使用,但您可以获取此特定类的代码并在WinForms中使用它)

 // Register for a specific message type Messenger.Default.Register(this, DoSomething); ... // Called when someone sends a message of type TypeOfTheMessage private void DoSomething(TypeOfTheMessage message) { // ... } // Send a message to all objects registered for this type of message Messenger.Default.Send(new TypeOfTheMessage(...)); 

Messenger类相对于静态事件的一大优势是它使用弱引用,因此它不会阻止订阅对象的垃圾收集,从而降低了内存泄漏的风险。

有关Messenger类的详细信息,请参阅此链接

因此,您可以创建表单发布者(以及控件之间的中介),并且您的所有控件都将成为将在事件中得到通知的订阅者。

控件中发生的事件,表单将被通知,表单上的事件处理程序将通知订阅此事件的其他控件。