事件总线 winform
时间: 2024-12-27 12:28:18 浏览: 12
### 实现 WinForms 中的事件总线模式
为了实现在 Windows Forms (WinForms) 应用程序中的事件总线模式,可以采用发布/订阅机制来解耦不同组件之间的通信。通过这种方式,各个模块不需要直接相互依赖即可相互通信。
#### 创建事件总线类
定义一个静态 `EventBus` 类作为消息中心:
```csharp
public static class EventBus
{
private static readonly Dictionary<Type, List<Delegate>> _subscribers = new();
public static void Subscribe<T>(Action<T> handler)
{
var eventType = typeof(T);
if (!_subscribers.ContainsKey(eventType))
_subscribers[eventType] = new List<Delegate>();
_subscribers[eventType].Add(handler);
}
public static void Unsubscribe<T>(Action<T> handler)
{
var eventType = typeof(T);
if (_subscribers.TryGetValue(eventType, out var handlers))
{
handlers.Remove(handler);
if (!handlers.Any())
_subscribers.Remove(eventType);
}
}
public static void Publish<T>(T @event)
{
if (_subscribers.TryGetValue(typeof(T), out var handlers))
{
foreach (var handler in handlers.ToList())
{
((Action<T>)handler)?.Invoke(@event);
}
}
}
}
```
此代码片段展示了如何创建简单的基于委托列表的事件总线[^1]。
#### 定义自定义事件对象
为特定类型的事件创建相应的数据传输对象(DTO),例如用户登录成功后的通知:
```csharp
public class UserLoggedInEventArgs : EventArgs
{
public string Username { get; set; }
public DateTime LoginTime { get; set; }
}
```
上述代码段说明了用于表示用户登录成功的事件参数结构。
#### 订阅者逻辑编写
任何想要接收该类型事件的对象都可以注册成为订阅者,在这里以窗体为例展示订阅过程:
```csharp
private void Form_Load(object sender, EventArgs e)
{
// 当有UserLoggedInEventArgs发生时触发
EventBus.Subscribe<UserLoggedInEventArgs>((args) =>
{
MessageBox.Show($"欢迎回来,{args.Username}! 登录时间:{args.LoginTime}");
});
}
protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);
// 移除不再需要的监听器
EventBus.Unsubscribe<UserLoggedInEventArgs>(_ => {});
}
```
这段代码显示了一个表单加载期间设置对用户登录事件的兴趣,并在关闭前清理这些兴趣点的方法。
#### 发布事件实例
当某个操作完成并希望向其他部分广播信息时,则调用如下方法发送新发生的事件:
```csharp
// 假设这是在一个按钮点击事件处理器内部执行的操作
private void btnLogin_Click(object sender, EventArgs e)
{
// 验证用户名密码...
bool isValidated = true;
if(isValidated){
var loginInfo = new UserLoggedInEventArgs()
{
Username = txtUsername.Text,
LoginTime = DateTime.Now
};
EventBus.Publish(loginInfo); // 向所有已登记的关注者分发这个事件
}
}
```
此处描述了一种模拟验证流程后公布用户登录详情的方式。
阅读全文