wpf 自定义 一个事件聚合自定义示例

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

相关推荐

  1. wpf 定义 一个事件聚合定义示例

    2024-07-10 18:16:03       8 阅读
  2. WPF定义控件,聚合器模式传递消息

    2024-07-10 18:16:03       47 阅读
  3. Vue定义事件

    2024-07-10 18:16:03       33 阅读
  4. 【Vue 定义事件

    2024-07-10 18:16:03       18 阅读
  5. WPF.NET开发】如何创建定义路由事件

    2024-07-10 18:16:03       50 阅读
  6. C#--WPF定义控件模板示例

    2024-07-10 18:16:03       16 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 18:16:03       5 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 18:16:03       5 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 18:16:03       4 阅读
  4. Python语言-面向对象

    2024-07-10 18:16:03       6 阅读

热门阅读

  1. socketserver

    2024-07-10 18:16:03       9 阅读
  2. 广州网络机房搬迁改造方案公司

    2024-07-10 18:16:03       11 阅读
  3. 什么是voc数据,和coco数据的区别是什么?

    2024-07-10 18:16:03       10 阅读
  4. Spring Boot 创建定时任务

    2024-07-10 18:16:03       10 阅读
  5. Redis

    2024-07-10 18:16:03       8 阅读
  6. C语言2D游戏

    2024-07-10 18:16:03       6 阅读
  7. Docker 容器出现 IP 冲突

    2024-07-10 18:16:03       9 阅读
  8. 构建安全稳定的应用:SpringSecurity实用指南

    2024-07-10 18:16:03       10 阅读
  9. 事务的范围比锁的范围大

    2024-07-10 18:16:03       10 阅读
  10. 深度解析:如何利用Python高效挖掘SQLite潜力

    2024-07-10 18:16:03       8 阅读