假设在自定义控件中我定义了一些自定义事件 myEvent。现在,当引发事件时,该事件将被父表单捕获。
如何在同一父窗体上的另一个自定义控件中捕获此事件?我希望其他控件以某种方式订阅第一个控件事件。
最佳答案
我在处理 MVC 时经常遇到类似的情况。我喜欢处理它的方式是在 Controller 中使用中介设计模式。
基本上,您有一个具有注册函数和通知函数的类。 register 函数采用一个实现监听器接口(interface)和 messageId 的对象。它将这些存储在字典中。通知函数采用需要发送给监听器的事件的 messageId,并通知相应的监听器事件已发生。
也许是这样的事情
public interface IListener
{
void MessageRaised(int messageId, params object[] arguments);
}
public class Mediator
{
public void Register(IListener listener, int messageId)
{
//... add to dictionary of arrays for each messageId
}
public void NotifyListeners(int messageId, params object[] arguments)
{
//... loop through listeners for the messageId and call the MessageRaised function for each one
}
}
现在通常我有一个基本 Controller ,它实现了一个静态中介对象。然后我的所有其他 Controller 都继承自它。如果您使用后面的代码并且无法继承,那么您可以尝试使用单例模式。 .Net 静态类也非常棒,因为它们有一个构造函数,因此您也可以使用它。
因此,在您的情况下,我会让每个控件背后的代码实现 IListener,然后在每个控件的构造函数中包含类似 Mediator.GetInstance().Register(this, Messages.MyEvent) 的内容。这是一种快速而肮脏的方法,可以在将来进行一些重构,以使其更具可重用性。
通过 Google 快速搜索得到的一些资源
http://www.avajava.com/tutorials/lessons/mediator-pattern.html
http://sourcemaking.com/design_patterns/mediator
祝你好运
关于c# - Winform自定义控件如何通知另一个Winform自定义控件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4337477/