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

时间:2010-12-17 23:41:59

标签: c# .net winforms events delegates

我在此表单上有一个winform winform1 和2个用户控件 control1 control2

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

3 个答案:

答案 0 :(得分:8)

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

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

// Register for a specific message type
Messenger.Default.Register<TypeOfTheMessage>(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

的详细信息,请参阅this link

答案 1 :(得分:8)

您可以使用静态事件:

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());

答案 2 :(得分:2)

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

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