using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WpfLibraryEventAggregator
{
public class EventAggregator
{
/// <summary>
/// 定义数据暂存
/// </summary>
private readonly Dictionary<Type, List<Delegate>> _handlers = new Dictionary<Type, List<Delegate>>();
// 订阅事件, 订阅后后续被触发事件
/// <summary>
/// d订阅事件 泛型方法
/// </summary>
/// <typeparam name="TEvent"></typeparam>
/// <param name="handler"></param>
public void Subscribe<T>(Action<T> handler)
{
Type eventType = typeof(T);
if (!_handlers.ContainsKey(eventType))
{
_handlers[eventType] = new List<Delegate>();
}
_handlers[eventType].Add(handler);
}
// 取消订阅事件
/// <summary>
/// 取消订阅事件
/// </summary>
/// <typeparam name="TEvent"></typeparam>
/// <param name="handler"></param>
public void Unsubscribe<T>(Action<T> handler)
{
Type eventType = typeof(T);
if (_handlers.ContainsKey(eventType))
{
_handlers[eventType].Remove(handler);
// 如果该事件类型没有订阅者了,可以移除它(可选)
if (!_handlers[eventType].Any())
{
_handlers.Remove(eventType);
}
}
}
/// <summary>
/// // 发布事件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="eventToPublish"></param>
public void Publish<T>(T eventToPublish)
{
Type eventType = typeof(T);
if (_handlers.ContainsKey(eventType))
{
foreach (var handler in _handlers[eventType].ToList()) // 使用 ToList 以避免在迭代时修改集合
{
((Action<T>)handler)(eventToPublish);
}
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WpfLibraryEventAggregator;
namespace WpfApp1.eventAggregator
{
/// <summary>
/// 自定义定义事件类
/// </summary>
public class MessageEvent //: EventArgs
{
public string Message { get; }
public MessageEvent(string message)
{
Message = message;
}
}
}
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using WpfApp1.eventAggregator;
using WpfLibraryEventAggregator;
namespace WpfApp1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
private readonly EventAggregator _eventAggregator = new EventAggregator();
public MainWindow()
{
InitializeComponent();
// 订阅事件
_eventAggregator.Subscribe<MessageEvent>(OnMessageReceived);
}
/// <summary>
/// 可以在别的页面调用来触发该事件相应
/// </summary>
/// <param name="e"></param>
private void OnMessageReceived(MessageEvent e)
{
// 处理事件,例如更新 UI
MessageBox.Show(e.Message);
}
private void btnevent_Click(object sender, RoutedEventArgs e)
{
// 假设在某个地方发布事件 ,发布会触发本页面
_eventAggregator.Publish(new MessageEvent("Hello, WPF!"));
}
// 确保在窗口关闭时取消订阅(可选)
protected override void OnClosed(EventArgs e)
{
// 注意:在这个简单的例子中,我们并没有真正的取消订阅逻辑,
// 因为 MainWindow 的实例将在应用程序结束时被销毁。
// 在更复杂的应用程序中,你可能需要跟踪所有订阅并显式取消它们。
_eventAggregator.Unsubscribe<MessageEvent>(OnMessageReceived);
// 避免事件挤压
base.OnClosed(e);
}
}
}