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问题都可以变成简单的单一问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/237480.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【三维重建】对极几何

极几何描述了同一场景或者物体的两个视点图像间的几何关系 可以发现&#xff30;在左右相机的投影点一定在各自的极线上&#xff0c;如果求出极线就能缩小求解对应点的范围。 本质矩阵对规范化摄像机拍摄的两个视点图像间的极几何关系进行代数描述 规范化相机指的是相机的内参…

专栏十五:omicverse在单细胞分析中的实际使用体验和小改动

写一些自己的理解吧,一些小步骤,正在更新中。。。 安装 原作者写的很清楚了 大部分直接抄 个别地方:去选择下载适合自己的pytorch版本PyTorch, 比如我的是cuda12,下载命令实际是 pip3 install torch torchvision torchaudio 查看cuda版本命令 nvidia-smi 当然还有个命…

YB9225是一种固定工作频率的高效率电流模式升压转换器。

YB9225B 1.2 MHz。峰值5A 电流&#xff0c;升压转换器 概述 &#xff1a; YB9225是一种固定工作频率的高效率电流模式升压转换器。YB9225集成了一个非常低的 Rds-on NMOSFTET&#xff0c;以减少功率损耗和实现高效率。最高效率可达93% 。功率 MOSFET 的峰值电流限制在5 A。1.…

大模型应用_ChatGPT-Next-Web

1 用后感 这个工具&#xff0c;我也是用了好长时间&#xff0c;就是感觉如果不点亮一颗星&#xff0c;自己就不是人了的那种。 一开始在国内用 ChatGPT 非常麻烦&#xff0c;就买了一个套壳的服务&#xff0c;他使用的界面就是 ChatGPT-Next-Web&#xff0c;我和朋友们都觉得这…

DevEco Studio将编辑器整体文本改为简体中文

我们打开编辑器 随便进入一个项目 这里 我们左上角目录 选择 File下面菜单中的 Settings… 打开配置界面 然后在设置窗口左侧导航栏中 选择 Plugins 插件 然后上方导航栏中 选择 Installed 参考下图 然后 找到这个Chinese(Simplified) Chinese是什么应该不用我多说吧 我们把…

第二百零二回 介绍一个三方包bluetooth_enable_fork

文章目录 1. 概念介绍2. 使用方法2.1 自定义主题2.2 覆盖父主题 3. 示例代码 我们在上一章回中介绍了图片缩放相关的内容&#xff0c;本章回中将介绍如使用主题.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在这里说的主题包含两方面的内容&#xff1a;…

`int(1)` 和 ‘int(10)‘

1 困惑 最近遇到个问题&#xff0c;有个表的要加个user_id字段&#xff0c;user_id字段可能很大&#xff0c;于是我提mysql工单alter table xxx ADD user_id int(1)。领导看到我的sql工单&#xff0c;于是说&#xff1a;这int(1)怕是不够用吧&#xff0c;接下来是一通解释。 …

网络测试工具:tcping-测试端口连接

网络测试工具&#xff1a;tcping-测试端口连接 平常使用的ping&#xff0c;是通过icmp协议去测试网络连通性的&#xff0c;tcping是通过tcp三次握手测试端口的连通性。总的来说&#xff0c;ping测试的是L3的连通性&#xff0c;tcping测试的是L4的连通性。 tcping工具下载 htt…

基于轻量级神经网络GhostNet开发构建光伏太阳能电池缺陷图像识别分析系统

工作中经常会使用到轻量级的网络模型来进行开发&#xff0c;所以平时也会常常留意使用和记录&#xff0c;在前面的博文中有过很多相关的实践工作&#xff0c;感兴趣的话可以自行移步阅读即可。 《移动端轻量级模型开发谁更胜一筹&#xff0c;efficientnet、mobilenetv2、mobil…

PHP基础(1)

PHP是一种服务器端脚本语言&#xff0c;是一种用于开发动态Web应用程序的最流行和广泛使用的语言之一。它的全称为“Hypertext Preprocessor”&#xff0c;是一种开源的、可嵌入HTML的脚本语言&#xff0c;可以嵌入到HTML中&#xff0c;也可以直接作为命令行脚本运行。PHP脚本在…

Redis对象——内存回收,对象共享和空转时长

一. 内存回收 因为C语言不具备内存回收功能&#xff0c;所以Redis在自己的对象系统中构建了一个引用计数技术实现内存回收机制。通过这一机制&#xff0c;程序可以通过跟踪对象的引用计数信息&#xff0c;在适当的时候自动释放对象并进行内存回收。 内每一个对象的引用计数信息…

node-sass@4.14.1 postinstall: `node scripts/build.js`

遇到一个前端项目安装node-sass依赖的问题&#xff1a;node-sass4.14.1 postinstall: node scripts/build.js 提供一个解决思路&#xff1a; 1、把package.json中node-sass这一行删掉 2、Terminal中执行 npm i node-sass -D 重新安装 3、package.json中会新增一个匹配当前n…

解读unity内置的软阴影处理方式

解读unity内置的软阴影处理方式&#xff1a; 参考网址&#xff1a; https://blog.csdn.net/cgy56191948/article/details/105726682 https://blog.csdn.net/weixin_45776473/article/details/119582218 https://tajourney.games/5482/ 上面的博客已经论述了&#xff0c;为何出现…

【基于LSTM的股票数据预测与分类】

基于LSTM的股票数据预测与分类 引言数据集与爬取数据处理与可视化股票预测与分类Flask页面搭建股票推荐功能创新点结论 引言 股票市场波动剧烈&#xff0c;对于投资者而言&#xff0c;精准的数据预测和分类是制定明智决策的基础。本文将介绍一种基于长短时记忆网络&#xff08…

福德植保无人机:绿色农业的新篇章

今天&#xff0c;我们荣幸地向您介绍福德植保无人机&#xff0c;一种改变传统农业种植方式&#xff0c;引领绿色农业的新科技产品。福德植保无人机以其高效、环保、安全的特点&#xff0c;正逐渐成为植保行业的新宠。福德植保无人机是一种搭载了高性能发动机和精确喷洒系统的飞…

TypeScript基础语法

目录 变量声明 条件控制 循环迭代 函数 类和接口 模块开发 变量声明 TypeScript在JavaScript的基础上加入了静态类型检查功能&#xff0c;因此每一个变量都有固定的数据类型。 条件控制 TypeScript与大多数开发语言类似&#xff0c;支持基于if-else和Switch的条件控制…

[原创]如何正确的部署R语言开发环境(含动图演示).

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、D…

目标检测——R-FCN算法解读

论文&#xff1a;R-FCN: Object Detection via Region-based Fully Convolutional Networks 作者&#xff1a;Jifeng Dai, Yi Li, Kaiming He and Jian Sun 链接&#xff1a;https://arxiv.org/pdf/1605.06409v2.pdf 代码&#xff1a;https://github.com/daijifeng001/r-fcn 文…

赛宁网安多领域亮相第三届网络空间内生安全发展大会

2023年12月8日&#xff0c;第三届网络空间内生安全发展大会在宁开幕。两院院士、杰出专家学者和知名企业家相聚南京&#xff0c;围绕数字经济新生态、网络安全新范式进行广泛研讨&#xff0c;为筑牢数字安全底座贡献智慧和力量。 大会围绕“一会、一赛、一展”举办了丰富多彩的…

2-1基础算法-枚举/模拟

文章目录 1.枚举2.模拟 1.枚举 [例1] 特别数的和 评测系统 #include <iostream> using namespace std; bool pa(int x) {while (x) {if (x % 10 2 || x % 10 1 || x % 10 0 || x % 10 9) {return true;}else {x x / 10;}}return false; } int main() {int sum0;i…