8.Prism聚合器的使用IEventAggregator

IEventAggregator 是一个事件聚合器,用于在不同模块之间进行通信。它允许模块之间进行解耦,通过发布和订阅事件来实现通信。

在使用 WPF prism IEventAggregator 时,你可以创建自定义事件,订阅事件并在需要时发布事件。这样可以实现模块之间的松耦合,提高代码的可维护性和可扩展性。

 

消息需要继承PubSubEvent

 /// <summary>
    /// 消息事件PubSubEvent<可以是值类型也可以是引用类型>
    /// </summary>
    public class MessageEvent : PubSubEvent<MessageModel>
    {
    }


    public class MessageModel
    {
        /// <summary>
        /// 模块
        /// </summary>
        public string Filter { get; set; }

        /// <summary>
        /// 内容
        /// </summary>
        public string Message { get; set; }
    }

 

聚合器方法

/// <summary>
    /// 事件聚合器方法
    /// </summary>
    public static class MessagerExtensions
    {
        /// <summary>
        /// 订阅
        /// </summary>
        /// <param name="aggregator">事件聚合器</param>
        /// <param name="action"></param>
        /// <param name="filterName"></param>
        public static SubscriptionToken ResgiterMessager(this IEventAggregator aggregator, Action<MessageModel> action, string filterName)
        {
            return aggregator.GetEvent<MessageEvent>().Subscribe(action, ThreadOption.PublisherThread, true, (p) =>
            {
                return p.Filter.Equals(filterName);
            });
        }

        /// <summary>
        /// 发布
        /// </summary>
        /// <param name="aggregator">事件聚合器</param>
        /// <param name="filterName">模块</param>
        /// <param name="messager">内容</param>
        public static void SendMessager(this IEventAggregator aggregator, string filterName, string messager)
        {
            aggregator.GetEvent<MessageEvent>().Publish(new MessageModel()
            {
                Filter = filterName,
                Message = messager
            });
        }

        /// <summary>
        /// 取消订阅
        /// </summary>
        /// <param name="aggregator">事件聚合器</param>
        /// <param name="subscriptionToken">订阅类型</param>
        public static void UnsubscribeMessager(this IEventAggregator aggregator, SubscriptionToken subscriptionToken)
        {
            aggregator.GetEvent<MessageEvent>().Unsubscribe(subscriptionToken);
        }

    }

 

使用:

  //订阅事件
            EventAggregator.ResgiterMessager(loginAtion, ViewNames.LoginView);





private void loginAtion(MessageModel obj)
        {
            if(IsHardwareInitialized)
            {
                NavigationParameters keyValues = new NavigationParameters();
                keyValues.Add("IndexViewKey", $"你好,现在时间{DateTime.Now.ToString("yyyy-MM-dd")}");

                ModuleManager.LoadModule(ModuleName.MainModuleProfile);//加载
                RegionManager.RequestNavigate(ContentControlName.MainWindowReginName, ViewNames.MainView, keyValues);//导航
            }
            else
            {
                PrismProvider.Dispatcher.Invoke(() =>
                {
                    //加载硬件初始化模块
                    PrismProvider.ModuleManager.LoadModule(ModuleName.InitializesModuleProfile);
                    //导航到主区域
                    PrismProvider.RegionManager.RequestNavigate(ContentControlName.MainWindowReginName, ViewNames.InitializesView);

                });

            }
        }

 

当发布消息的时候会执行loginAtion方法

_eventAggregator.SendMessager(ViewNames.LoginView, "登入成功");//发布

 

posted @ 2024-02-10 09:16  野码  阅读(549)  评论(0编辑  收藏  举报