MAUI劝退:内部消息机制(社区工具包)
MAUI劝退得很啊,MessageCenter已经标记为废弃,建议改为社区工具包。这不叫“日新月异”,这叫朝令夕改。
windows和MFC的消息机制是很麻烦的,各种高级语言都简化了消息机制,基本上都采用类似中间件的发布接收模型,使用发送和注册就能完成(以及取消注册)。
目录
一、引入社区工具包
二、弱引用和强引用
三、发送消息
四、接收消息
五、效果
一、引入社区工具包
使用nuget工具引入CommunityToolkit.Mvvm,然后就可以了,粘贴代码的时候会自动添加所需的引用。

代码需要引入这个:
using CommunityToolkit.Mvvm.Messaging;
二、弱引用和强引用
弱引用简单但是可能浪费内存,强引用性能更好但是要主动注销。一般情况下也不是很在意啦。
弱引用叫做WeakReferenceMessenger,强引用叫做StrongReferenceMessenger,他们都有一个默认实现叫做“Default”,我们用这个就够了。
三、发送消息
发送消息非常简单:
WeakReferenceMessenger.Default.Send(消息体);
消息机制以消息体的类型和令牌来区分,不是很复杂的程序不需要区分令牌,因此上面的代码仅仅使用了消息体。
四、接收消息
接收消息需要注册接收者,术语叫收件人。就是挂个回调函数上去嘛。
WeakReferenceMessenger.Default.Register<消息体类型>(this, (r, m) =>{// Handle the message here, with r being the recipient and m being the// input message. Using the recipient passed as input makes it so that// the lambda expression doesn't capture "this", improving performance.MyLog.Log($"{r.ToString()} {m}");});
如果不讲究的话消息体类型可以用string,然后就能在多个模块之间收发了。
但是如果既发又收,都用string就会收到自己发出去的消息,这样就不理想了。
可以简单地按照收发方向给每种消息定义一个独立的类型,这样就不会混淆了。
比如:
internal class MessageType_FileOpened{public MessageType_FileOpened(string file) { filename = file; }public string filename = "";}internal class MessageType_MenuClicked{public MessageType_MenuClicked(string file) { filename = file; }public string filename = "";}
五、效果
没啥效果啦,两句代码而已。
另,可以用Unregister注销接收者,不过一般忘了也没什么。
(这里是文档结束)
