定义消息类
首先,我们需要定义消息类来表示不同的消息类型。在示例中,我们创建了一个叫做CloseWindowMessage的消息类,用于表示需要关闭窗体的消息。这个类通常是一个简单的标记类,不包含任何额外的数据。
public class CloseWindowMessage
{
// 这里可以添加任何额外的信息或方法,但通常情况下不需要
}
创建消息中心类
接下来,我们需要创建一个消息中心类,用于管理消息的订阅和发布。在示例中,我们创建了一个静态类MessageCenter,它包含了订阅、取消订阅和发布消息的静态方法。
public class CloseWindowMessage
//消息中心,用于管理消息的订阅和发布
public static class MessageCenter
{
private static Dictionary<Type, List<Action<object>>> _subscribers = new Dictionary<Type, List<Action<object>>>();
// 订阅消息的方法
public static void Subscribe<TMessage>(Action<TMessage> action)
{
// 实现订阅逻辑
Type messageType = typeof(TMessage);
if (!_subscribers.ContainsKey(messageType))
{
_subscribers[messageType] = new List<Action<object>>();
}
_subscribers[messageType].Add(obj => action((TMessage)obj));
}
// 取消订阅消息的方法
public static void Unsubscribe<TMessage>(Action<TMessage> action)
{
// 实现取消订阅逻辑
Type messageType = typeof(TMessage);
if (_subscribers.ContainsKey(messageType))
{
_subscribers[messageType].Remove(obj => action((TMessage)obj));
}
}
// 发布消息的方法
public static void Send<TMessage>(TMessage message)
{
// 实现发布消息逻辑
Type messageType = typeof(TMessage);
if (_subscribers.ContainsKey(messageType))
{
foreach (var subscriber in _subscribers[messageType])
{
subscriber(message);
}
}
}
}
public class Message
{
public string Content { get; }
public Message(string content)
{
Content = content;
}
}
订阅消息
在需要接收特定类型消息的地方(比如ViewModel或窗体),我们调用MessageCenter.Subscribe方法来订阅消息。在示例中,我们在ViewModel的构造函数中订阅了CloseWindowMessage消息,并指定了一个方法来处理收到的消息。
public class ViewModel
{
public ViewModel()
{
// 订阅关闭窗体消息
MessageCenter.Subscribe<CloseWindowMessage>(OnCloseWindowMessageReceived);
}
// 处理收到的关闭窗体消息的方法
private void OnCloseWindowMessageReceived(CloseWindowMessage message)
{
// 执行关闭窗体的逻辑...
}
}
发布消息
当某个事件发生,需要发送消息时(比如点击按钮关闭窗体),我们调用MessageCenter.Send方法来发布消息。在示例中,当用户点击关闭按钮时,ViewModel调用MessageCenter.Send来发布CloseWindowMessage消息。
public class ViewModel
{
public ViewModel()
{
CloseWindowCommand = new RelayCommand(CloseWindow);
}
public ICommand CloseWindowCommand { get; }
private void CloseWindow()
{
// 发布关闭窗体消息
MessageCenter.Send(new CloseWindowMessage());
}
}
处理消息
订阅了消息的部分会收到消息,并根据需要执行相应的操作。在示例中,窗体订阅了CloseWindowMessage消息,并在收到消息时执行关闭窗体的操作。
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
// 订阅关闭窗体消息
MessageCenter.Subscribe<CloseWindowMessage>(OnCloseWindowMessageReceived);
}
private void OnCloseWindowMessageReceived(CloseWindowMessage message)
{
// 执行关闭窗体的操作
Close();
}
}