WPF仿网易云搭建笔记(4):信息流控制之消息订阅

2023-12-12 04:44

本文主要是介绍WPF仿网易云搭建笔记(4):信息流控制之消息订阅,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 专栏和Gitee仓库
  • 前言
  • 消息订阅
    • 最简单的案例
      • 简单用例
        • 父组件订阅
        • 子组件回调
      • 结果
    • 消息订阅机制
      • 消息token是A还是B?
      • 传递消息的载体。
      • 双重token
      • 重复订阅问题
  • 结论

专栏和Gitee仓库

WPF仿网易云 Gitee仓库

WPF仿网易云 CSDN博客专栏

前言

上一篇文章中,我们简单讲解了一下父子通讯的逻辑。父子通讯是强绑定逻辑。这里我们将讲解消息订阅通讯的方式。消息订阅一般用于[页]和[页]之间通讯。

消息订阅

WPF消息订阅一共有两种方案,一个是Prism的方案,一个是CommunityToolkit.Mvvm的方案。

WPF Prims框架详解

WPF CommunityToolkit.Mvvm Messenger通讯

这里我们使用使用CommunityToolkit.Mvvm。使用Prism的也可以。

最简单的案例

简单用例

不了解CommunityToolkit.Mvvm的可以看这个

WPF CommunityToolkit.Mvvm Messenger通讯

这里用到了record,不了解的可以看这个文章。当然也可以用class

博客园 C# – Record, Class, Struct

父组件订阅
namespace BlankApp1.Views
{/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainWindow : Window{public record MainWindowMessage(string msg);public MainWindowViewModel ViewModel { get; set; }public MainWindow(){......其它代码InitializeComponent();//订阅MainWindowMessage的对象数据WeakReferenceMessenger.Default.Register<MainWindowMessage>(this,MessageRecieve);//也可以取消订阅,但是一般不用//WeakReferenceMessenger.Default.Unregister<MainWindowMessage>(this);}private void MessageRecieve(object recipient, MainWindowMessage message){Debug.WriteLine("接受到消息"+message.msg);}}
}
子组件回调
MiniWindow = new RelayCommand(() => {//其它代码逻辑,不重要......//发送订阅消息WeakReferenceMessenger.Default.Send(new MainWindowMessage("缩小窗口"));
});

结果

在这里插入图片描述

消息订阅机制

我们模拟一个最简单的消息订阅场景。ViewA给ViewB推送消息。

消息token是A还是B?

我们推送订阅消息,需要用到Key去推送订阅。那么用的是Key_A还是Key_B呢。

这个时候,我们就要想到推送开发时候的流程了。我们一般开发都是先暴露,再使用的代码开发流程。所以我们一般是先想ViewB能做什么,先写好订阅,再写推送逻辑的。而且一般是一次订阅,多次推送。可以ViewA推送ViewB,也可以ViewC推送ViewB,ViewD推送ViewB。

所以结论:用到token是订阅者的token。是token_B

传递消息的载体。

我们传递消息,需要考虑到载体的问题。我们为了简化代码,一般消息载体都是用string字符串作为载体。使用Json格式传递。通过序列化和反序列化来进行区别。

这里我推荐使用Newtonsoft。这里不展开说明

在这里插入图片描述

双重token

CommunityToolkit.Mvvm8.1 消息通知(4)

【CommunityToolkit.Mvvm】Messenger 信使

如果是单一Token,只能做到View的订阅。如果是双重Token,我们可以做到View的某个函数的订阅。极大得增强了函数的复用性。这里我建议使用Enum枚举类型作为token

/// <summary>
/// 消息订阅载体
/// </summary>
/// <param name="Msg"></param>
public record MainWindowMessage(string Msg);//声明enum枚举类型
public enum MainWindowMessageToken { Test1, Test2 }//双重token订阅
WeakReferenceMessenger.Default.Register<MainWindowMessage, string>(this, MainWindowMessageToken.Test1.ToString(), MessageRecieve);//使用token双重推送
WeakReferenceMessenger.Default.Send(new MainWindowMessage("缩小窗口"), MainWindowMessageToken.Test1.ToString());

重复订阅问题

如果重复订阅,会主动抛出异常

在这里插入图片描述

结论

我们消息流已经基本解决了。

  • 强关联:父子通讯:组件化通讯
  • 弱关联:消息订阅:页与页,窗口与窗口

我们最后的信息流控制就是IOC容器了,IOC容器解决了之后,我们已经将WPF完全解耦,所有复杂的WPF问题都可以变成简单的单一问题。

这篇关于WPF仿网易云搭建笔记(4):信息流控制之消息订阅的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/483269

相关文章

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Python极速搭建局域网文件共享服务器完整指南

《Python极速搭建局域网文件共享服务器完整指南》在办公室或家庭局域网中快速共享文件时,许多人会选择第三方工具或云存储服务,但这些方案往往存在隐私泄露风险或需要复杂配置,下面我们就来看看如何使用Py... 目录一、android基础版:HTTP文件共享的魔法命令1. 一行代码启动HTTP服务器2. 关键参

RabbitMQ消息总线方式刷新配置服务全过程

《RabbitMQ消息总线方式刷新配置服务全过程》SpringCloudBus通过消息总线与MQ实现微服务配置统一刷新,结合GitWebhooks自动触发更新,避免手动重启,提升效率与可靠性,适用于配... 目录前言介绍环境准备代码示例测试验证总结前言介绍在微服务架构中,为了更方便的向微服务实例广播消息,

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

Spring如何使用注解@DependsOn控制Bean加载顺序

《Spring如何使用注解@DependsOn控制Bean加载顺序》:本文主要介绍Spring如何使用注解@DependsOn控制Bean加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录1.javascript 前言2. 代码实现总结1. 前言默认情况下,Spring加载Bean的顺

如何使用Haporxy搭建Web群集

《如何使用Haporxy搭建Web群集》Haproxy是目前比较流行的一种群集调度工具,同类群集调度工具有很多如LVS和Nginx,本案例介绍使用Haproxy及Nginx搭建一套Web群集,感兴趣的... 目录一、案例分析1.案例概述2.案例前置知识点2.1 HTTP请求2.2 负载均衡常用调度算法 2.

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

Python远程控制MySQL的完整指南

《Python远程控制MySQL的完整指南》MySQL是最流行的关系型数据库之一,Python通过多种方式可以与MySQL进行交互,下面小编就为大家详细介绍一下Python操作MySQL的常用方法和最... 目录1. 准备工作2. 连接mysql数据库使用mysql-connector使用PyMySQL3.