Prism消息订阅

1.新增一个类,继承PubSubEvent类

    public class MessageEvent : PubSubEvent<string>
    {
    }
    public class TestEvent : PubSubEvent<Test>
    {//测试发送一个对象过去
    }
    public class Test
    {
        public string Id { get; set; }
        public string Name { get; set; }
    }
    public class MessageEventFilter : PubSubEvent<MessageFilter>
    {//增加过滤器
    }
    public class MessageFilter
    {
        public string Filter { get; set; }
        public string Message { get; set; }
    }

2.推送消息,注意的是构造函数要加载 IEventAggregator接口

        private readonly IEventAggregator _eventAggregator;
        public MainViewModel(IRegionManager regionManager, IDialogService dialogService,IEventAggregator eventAggregator)
        {
            _reionManager = regionManager; //在构造函数中赋值
            _dialogService = dialogService;
            _eventAggregator = eventAggregator;//一定要用它推送,其它的是其它的功能,不用可以删除
        }

//下面是三种推送方式
        public ICommand ClickCommandMessage
        {//推送带过滤器的消息,里面多加了一个颜色
            get => new DelegateCommand(() => {
                _eventAggregator.GetEvent<Event.MessageEventFilter>().Publish(new Event.MessageFilter() { Filter = "Login", Message = "我是中国人.",brush=Brushes.Red });
            });
//接收那边会判断Filer一致才会显示消息
        }
        public ICommand ClickCommandMessage1
        {//推送一个对象
            get => new DelegateCommand(() => {
                Event.Test test= new Event.Test()
                { 
                Id = "1",
                Name ="2",
                };
                _eventAggregator.GetEvent<Event.TestEvent>().Publish(test);//传过去的实际上是一个对象
            });
        }
        public ICommand ClickCommandMessage2
        {//推送普通消息
            get => new DelegateCommand(() => {
                _eventAggregator.GetEvent<Event.MessageEvent>().Publish( "我是中国人." );
            });
        }

3.接收消息,在构造函数里面写好事件,三种方式选其一,看基体使用场景

        private readonly IEventAggregator eventAggregator;

        public MainView(IEventAggregator eventAggregator)
        {
            InitializeComponent();
            this.eventAggregator = eventAggregator;
            //过滤器,只接收Filter传过来对应的信息显示出来
            eventAggregator.GetEvent<Event.MessageEventFilter>().Subscribe(MessageFilter, ThreadOption.PublisherThread, true,
                (m) =>
                {
                    return m.Filter.Equals("Login");
                });
            eventAggregator.GetEvent<Event.TestEvent>().Subscribe(Sub_Object);//接收的是一个对象
            eventAggregator.GetEvent<Event.MessageEvent>().Subscribe(Sub_Message);//接收普通的消息
        }

//下面是方法,也可写在匿名方法中,其实内容都差不多,只是参数不一样而已
        private void MessageFilter(MessageFilter obj)
        {
            loginSnackBar.MessageQueue.Enqueue(obj.Message);//这个是materialdesig里面的弹窗,比VS自带的要好看.
            loginSnackBar.Foreground = obj.brush;
        }

        private void Sub_Object(Test obj)
        {
            MessageBox.Show(obj.Id + obj.Name);

        }

        private void Sub_Message(string obj)
        {
            loginSnackBar.MessageQueue.Enqueue(obj);
            // MessageBox.Show(obj);
            //     eventAggregator.GetEvent<Event.MessageEvent>().Unsubscribe(Sub_Message);//这里是取消订阅消息,看用在哪里合适.
        }

4.如果要使用loginSnackBar,就要在xml中加入以下内容

xmlns:md="http://materialdesigninxaml.net/winfx/xaml/themes" 声明

        <md:Snackbar
            x:Name="loginSnackBar"
            Panel.ZIndex="1"
            FontWeight="Bold"
            MessageQueue="{md:MessageQueue}" />
Snackbar控件的添加

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值