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控件的添加