我在此表单上有一个winform winform1 和2个用户控件 control1 和 control2
现在我要定义一个自定义事件,它在control1中引发/触发并在control2中接收。该事件应为全局,而不是在control1中直接定义。 control2不应该知道control1的存在。 该事件也应由其他控件提出。 C#代码怎么样?我需要像出版商那样的东西吗?
答案 0 :(得分:8)
您所描述的内容类似于Mediator pattern,其中对象通过消息进行通信。这些消息可以实现为事件,回调或任何其他机制。
您可以使用类似MVVM Light的Messenger
类的实现(此框架旨在与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
类
答案 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)
因此,您可以创建表单发布者(以及控件之间的中介),并且您的所有控件都将成为将在事件中得到通知的订阅者。
控件中发生的事件,表单将被通知,表单上的事件处理程序将通知订阅此事件的其他控件。