2022-09-04 23:46:49
摘要:一、了解MVVM
1. 什么是MVVM
一种设计模式
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
为什么需要MVVM?解决什么问题?
降低耦合、独立开发、逻辑重用(Xamarin MAUI多平台应用)、可测试
响应式布局
2. 控件交互到MVVM模式的转变
控件交互:基于控件的功能开发
-MVVM****模式
代码/项目结构
Models:
Views:
ViewModels:
3. MVVM绑定模式下的信息交互
数据类型:INotifyPropertyChanged接口
public event PropertyChangedEventHandler? PropertyChanged;
执行事件,发公告
ContextMenu,注意:命令的数据源的指定
行为动作:ICommand接口
public event EventHandler? CanExecuteChanged;
public bool CanExecute(object? parameter)
public void Execute(object? parameter)
是不是所有控件都有Command属性?是不是所有动作都可以使用Command?
无法绑定的动作如何处理?
4. MVVM绑定扩展
无法绑定的对象属性
通过附加属性进行扩展
无法绑定的动作事件
(InputBindings: )
单击鼠标左键 :LeftClick 双击鼠标左键:LeftDoubleClick
单击鼠标中键 :MiddleClick 双击鼠标中键:MiddleDoubleClick
单击鼠标右键:RightClick 双击鼠标右键:RightDoubleClick
不执行任何操作:None 旋转鼠标滚轮:WheelClick
事件转命令
Behavior
自定义实现
5. MVVM案例
一般页面信息绑定
页面集合绑定
任意数据源绑定
自定义控件
6. MV……
阅读全文
2022-08-29 23:42:50
摘要:一、WPF控件的组成
1. 逻辑与呈现的分离
控件模板旨在成为展示详细信息的自包含单元,对外部用户和对象(包括 Style 对象)不可见。 操作控件模板内容的唯一方法是在当前控件模板中。
2. 模板修改:显示区域的内容重组
Button模板Template:渲染对象、属性值的关联、触发器
样式与模板
3. 基础控件如何显示的?
功能最强大,布局最灵活的容器
主要属性配置:
ColumnDefinitions(ColumnDefinition)、RowDefinitions(RowDefinition)、ShowGridLines、IsSharedSizeScope(SharedSizeGroup)、给子项控件使用:Grid.Row Grid.Column
使用场景:广泛,不知道用什么布局,就用Grid,意外(WrapPanel)
二、模板中的基础控件
1. 基础元素的呈现:DrawingContext DrawRect
TextBlock
Border
OnRender
2. 控件模板案例解析
Label、GroupBox、CheckBox、RadioButton、ToggleButton
TextBox/PasswordBox、TabControl/TabItem、TreeView/TreeViewItem、ListBox/ListBoxItem、ListView/ListViewItem、Menu/MenuItem
ComboBox、ScrollViewer、ProgressBar、Slider
Calendar/DatePicker、DataGrid
模板的添加与修改
默认模板:wpf\src\Microsoft.DotNet.Wpf\src\Themes
3. 控件模板案例解析
基本控件的使用
名称、基本作用表现、特征
常用属性:尺寸、定位、显示内容
常用事件:点击、输入
控件的特殊属性
Style:用来统一设置控件属性的对象
Resources:资源管理,存放可共用的数据(变量、样式、模板)
Template:用来控制控件的呈现
目的:
三、属性与绑定
1. WPF的数据关系
绑定关系:数据绑定是应用呈现数据并与数据交互提供了一种简单而一致的方法,在应用 UI 与其显示的数据之间建立连接的过程。
2. 建……
阅读全文
2022-08-28 10:40:57
摘要:一、界面布局
1. 布局原则
不用显式的方式设定元素的尺寸
不使用屏幕坐标来指定位置
2. 常用布局控件与布局处理
Grid
StackPanel
DockPanel
WrapPanel
UniformGrid
Canvas
InkCanvas
Border(装饰控件:背景色/边框 圆角 子对象也只能一个)
3. Grid
功能最强大,布局最灵活的容器
主要属性配置:
ColumnDefinitions(ColumnDefinition)、RowDefinitions(RowDefinition)、ShowGridLines、IsSharedSizeScope(SharedSizeGroup)、给子项控件使用:Grid.Row Grid.Column
使用场景:广泛,不知道用什么布局,就用Grid,意外(WrapPanel)
4. StackPanel
最简单的布局容器之一
主要属性配置:Orientation-调整排列方向、FlowDirection
使用场景:图文并显、工具栏
可以Grid代替
5. WrapPanel
唯一一个不能被Grid替代的布局控件,水平方向排列,过程中当前子项出界了,进行折行
主要属性配置:Orientation-调整排列方向
使用场景:桌面式图标排列、搜索历史关键词排列
6. DockPanel
通过设置Dock停靠进行布局
主要属性配置:LastChildFill、DockPanel.Dock
使用场景:应用的主窗口布局(标题栏、状态栏、工具栏、菜单栏)
7. UniformGrid
另一种行列风格布局,自动生成统一一致的行列
主要属性配置:Columns、Rows 指定的是当前区域均分多少行和列,不存在指定行高和列宽
使用场景:9宫格的功能区域、图表
8. Canvas
通过精确坐标定位放置子元素
主要属性配置:Canvas.Left、Top、Right、Bottom
使用场景:组态、组件封装(仪表)
9. InkCanvas
支持任意笔画输入的画布组件
主要属性配置:
使用场景:手写墨迹识别(不是手写图像识别):文字、图形
10. Border
最基础的装饰控件
主要属性配置:
使用场景:
二、界面布局处理案例分析
1. 可视化数字看板
使用控件总结:Border ……
阅读全文
2022-08-22 12:37:23
摘要:一、基本对象
1. WPF 3D
WPF 中 3D 功能的设计初衷并非提供功能齐全的游戏开发平台。
WPF 中的 3D 图形内容封装在 Viewport3D 元素中,该元素可以参与二维元素结构。 该图形系统将 Viewport3D 视为一个二维视觉元素,就像 WPF 中的许多其他元素一样。 Viewport3D 充当三维场景中的窗口(即视区)。 更准确地说,它是 3D 场景所投影到的图面。
2. 模型3D场景
3D视口
坐标系
点、线、面、三角顶点网格
材质
光源
相机
3. 3D对象模型结构
MeshGemetry3D
Positions
TraiangleIndices
TextureCoordinates:如何对应?
4. 相机
OrthographicCamera:正交
PerspectiveCamera:透视
基本属性:
Position:相机的空间坐标(X,Y,Z)
LookDirection:观察方向,向量,相机观察口朝向
FieldOfView(透视相机属性) / Width(正交相机属性):视野范围(焦距),一个值
UpDirection:相机上方方向,控制相机观察口旋转
FarPlaneDistance:远景距离,大于这个距离的场景不渲染
NearPlaneDistance:近景距离,小于这个距离的场景不渲染
5. 3D对象模型材质
DiffuseMaterial:漫反射,反射场景光效果
EmissiveMaterial:自发光,类似于电灯
SpecularMaterial:全反射,可以映射场景
贴图(平面贴图、曲面贴图-地球)
背面材质
6. 3D对象模型光源
AmbientLight:环境光
DirectionalLight:平行光
PointLight:点光源
SpotLight:聚光灯
相关属性
Color:灯光颜色
Direction:光线方向(平行光、聚光灯)
Position:光源坐标(点光源、聚光灯)
Range:灯光范围(点光源)
InnerConeAngle:内光柱照射角度(聚光灯)
OuterConeAngle:外光柱照射角度(聚光灯)
7. 3D对象的变换
Transform3D:平移 xyz
ScaleTransform3D:缩放
RotateTransform3D:旋转
M……
阅读全文
2022-08-21 22:56:30
摘要:一、基础控件汇总
控件类型
主要控件
按钮控件
Button、RepeatButton、RadioButton
数据显示控件
TextBlock、Label、Image、ItemsControl**、ListView、ListBox、**DataGrid、DocumentViwer
输入控件
TextBox、RichTextBox、CheckBox、ComboBox、DatePicker、PasswordBox、Slider、ProgressBar
菜单导航控件
MenuItem、ContextMenu、ToolBar、TreeView、TabControl、Expander
信息提示控件
Popup、Window、PrintDialog、ToolTip
布局控件
Grid**、StackPanel、WrapPanel、DockPanel、UniformGrid、Canvas、InkCanvas、**Border
图形控件
Line、Rectangle、Ellipse、Polyline、Polygon、Path
其他控件
ScrollViwer、GroupBox、ViewBox
1. 常用属性
尺寸(宽高)、定位(Margin,HorizontalAlignment、VerticalAlignment)、颜色(Background、Foreground)、信息显示(Text、Content、ListViewItem、ListBoxItem、DataGridTextColumn…..)
鼠标事件、键盘事件
特别属性
RadioButton:GroupName
集合控件:AlternationCount
ComboBox:SelectedItem、SelectedValue、SelectedValuePath、DisplayMemberPath、SelectedIndex
DatePicker:SelectedDate、DisplayDateStart、DisplayDateEnd
PasswordBox:Password(普通属性)
Silder、ProgressBar:最小值、最大值、当前值
Popup:IsOpen、Placement、PlacementTarget、StaysOpen
Window:无边……
阅读全文
2022-04-30 20:53:37
摘要:Kafka最初是领英公司开发的消息流组件,后来捐献给了Apche。
一、拓扑结构
Broker 是 Kafka 集群中的核心服务器,你可以把它想象成一个邮局:
生产者(Producer)就像寄信人,把消息(信件)送到 Broker(邮局)
消费者(Consumer)就像收信人,从 Broker 取走自己的消息
一个 Kafka 集群通常由多个 Broker 组成,共同处理消息存储和转发Broker 的核心职责
1. 消息存储中心
持久化存储 :所有消息最终都会写入磁盘,而不仅仅是内存
分区管理 :每个 Broker 负责存储某些分区的数据
日志分段 :将大日志文件分割成多个段(segment),便于维护和清理
2. 消息路由中心
维护所有主题/分区的元数据信息
决定生产者应该把消息发送到哪个分区
协调消费者从哪个分区获取消息
3. 副本协调者
管理 Leader 副本和 Follower 副本的同步
监控副本的健康状态
在 Leader 失效时组织新的选举Broker的工作流程
Kafka的存储结构就像一本书的目录:
主题(Topic) :相当于书的标题,是消息的分类。比如用户注册、订单支付等。
分区(Partition) :相当于书的章节,每个主题可以被分成多个分区。分区使Kafka可以并行处理消息。
副本(Replica) :相当于书的复印本,每个分区可以有多个副本(通常3个)。分为Leader副本(主本)和Follower副本(副本)。
Kafka 会智能地将副本分布在不同 Broker 上:
同一个分区的不同副本不会放在同一个 Broker
尽量将分区的 Leader 均匀分布在所有 Broker
例如下图有 2个 Broker 和 1 个主题(分区数=3,副本数=2):
Kafka的消息存储就像写日记:
消息以追加(append-only) 方式写入分区,不可修改
每个消息都有一个位移(offset) ,相当于日记的行号
消息按时间保留(默认7天),超过时间自动删除
分区日志被分成多个段(segment) 文件,便于管理
基于日志结构构建的消息引擎:消费消息时是读取日志文件,消息不会删除
二、消息流程
1. 消息写入流程
生产者连接到任意 Broker 获取元数据
Broker 返回主题分区信息和 Leader Brok……
阅读全文
2022-04-10 11:35:15
摘要:★★★★★★http://www.rabbitmq.com/which-erlang.html (rabbitmq和erlang版本对应表)
RabbitMQ 群集安装(每一台机器都操作)
一、环境描述
1、操作系统
主机名
IP地址
操作系统版本
erlang 版本
rabbitmq 版本
192.168.3.99
node02
CentOS Linux release 7.4.1708 (Core)
21.0
3.7.7
192.168.3.100
node01
CentOS Linux release 7.4.1708 (Core)
21.0
3.7.7
192.168.3.222
node03
CentOS Linux release 7.4.1708 (Core)
21.0
3.7.7
2、设置linux静态IP+
命令:
# cd /etc/sysconfig/network-scripts/
# vim ifcfg-ens33
修改内容为:
TYPE=Ethernet
PROXY_METHOD=none
BOOTPROTO=static #静态IP
BROWSER_ONLY=no
DEFROUTE=yes
IPADDR=192.168.1.189 #调整
NETMASK=255.255.255.0 #调整
GATEWAY=192.168.1.1 #调整
DNS1=202.106.0.20 #调整
DNS2=8.8.8.8
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=312fb2fd-eade-4e6f-8abb-5602fc8d2da4
DEVICE=ens33
ONBOOT=yes # 支持静态IP
修改完毕后:执行命令:
# service network restart
重启网卡:
# systemctl restart network
3.关闭防火墙
查看防火墙:
# systemctl status firewalld.service
开……
阅读全文
2022-04-09 11:18:54
摘要:
一、消息队列的核心价值
应用场景
异步处理:电商订单支付成功后,异步通知库存系统扣减,避免主流程阻塞。
削峰填谷:秒杀活动瞬间高并发请求先入队,后端按处理能力消费,保护系统稳定性。
系统解耦:支付系统与物流系统通过消息传递数据,无需直接接口调用。
核心概念
生产者(Producer):发送消息的程序(如订单系统)。
消费者(Consumer):接收消息的程序(如库存系统)。
队列(Queue):消息的缓冲存储区,遵循先进先出(FIFO)原则。
二、主流消息队列产品对比
产品
特点
适用场景
RabbitMQ
基于AMQP协议,支持灵活的路由规则(交换机)、消息确认机制,功能全面
复杂业务逻辑、企业级应用
Kafka
高吞吐、持久化、分布式设计,支持百万级TPS
日志采集、实时流处理
RocketMQ
阿里开源,低延迟、高可用,专为金融场景优化
电商交易、大规模事务消息
Redis List
轻量级,基于内存操作,无高级特性(如重试、持久化)
简单任务队列、缓存场景
三、消息模型深度解析
队列模型(P2P)
单消费者消费消息,适用于订单支付、库存扣减等需严格顺序的场景。
发布-订阅模型(Pub/Sub)
典型应用:新闻推送、用户行为广播(如积分系统、数据分析系统同时消费)。
交换机模式——RabbitMQ特有
四、AMQP协议
AMQP核心组件
交换机(Exchange):接收生产者消息,按规则路由到队列(直连、广播、主题等模式)。
队列(Queue):临时存储消息的容器。
绑定(Binding):定义交换机与队列的映射关系。
工作流程
建立连接
选择/创建虚拟主机
创建交换机和队列
绑定交换机和队列
发布消息
路由消息
消息消费
消息确认 ACK
断开连接
五、RabbitMQ实战
1. RabbitMQ部署
docker run -d \
--name rabbit-01 \
--hostname my-rabbit \
-p 5672:5672 \ # AMQP端口
-p 15672:15672 \ # 管理界面端口
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=passw……
阅读全文
2022-04-02 21:34:55
摘要:一、MongoDB核心概念
1. 定位与优势
目标:处理海量数据(名称源自humongous),支持高可用、水平扩展。
数据模型:
JSON文档结构:天然贴合面向对象思想,支持嵌套对象和数组。
动态模式:使用BSON(JSON的二进制扩展)存储,支持日期、二进制等扩展类型。
核心优势:
易用性:类JSON语法降低学习成本。
高性能:内存映射引擎、写优化设计。
高可靠性:副本集自动故障转移。
高扩展性:原生分布式架构(分片集群)。
2. SQL vs MongoDB概念对比
关键差异:MongoDB属于半结构化数据模型,无固定表结构,不支持事务级JOIN。
二、基础操作实战
1. 集合与文档操作
// 创建/切换数据库
use sample
// 插入文档
db.persons.insertOne({ name: 张三, age: 22 })
db.persons.insertMany([...])
// 查询文档
db.movies.find( { year : 1975 } ) //单条件查询
db.movies.find( { year : 1989, title : Batman } ) //多条件and查询
db.movies.find( { $and : [ {title : Batman}, { category : action }] } ) // and的另一种形式
db.movies.find( { $or: [{year : 1989}, {title : Batman}] } ) //多条件or查询
db.movies.find( { title : /^B/} ) //按正则表达式查找
// 更新与删除
db.persons.updateMany({ age: 22 }, { $set: { status: active }})
db.persons.deleteMany({ age: { $lt: 18 }})
db.runCommand({ drop: persons }) // 删除集合
2. 查询条件对照表
SQL
MQL
a = 1
{ a: 1 }
a 1
{ a: { $ne: 1 } }
a 1
{ a: { $gt: 1 } }
a = 1
{ a: ……
阅读全文
2022-03-26 14:47:44
摘要:前提条件
在开始之前,请确保您已经准备好了 redis-cluster 文件夹,内部包含 docker-compose.yml 和 redis.conf 文件。
创建哨兵配置文件 (sentinel.conf)
在 redis-cluster 文件夹中,新建一个名为 sentinel.conf 的文件。
将以下配置内容复制并粘贴到 sentinel.conf 文件中。
# 哨兵监控的主节点信息
# 格式: sentinel monitor master-name ip port quorum
# name: 自定义的集群名称,例如 myredis
# ip: 主节点的IP、主机名、容器名
# port: 主节点的端口 6379
# quorum: 法定人数。表示至少需要多少个哨兵同意,才能判定主节点下线。3个哨兵建议设置为2
sentinel monitor myredis 6379 2
# 主节点连接密码。这必须与您在 redis.conf 中设置的 requirepass 和 masterauth 密码一致
# 格式: sentinel auth-pass master-name password
sentinel auth-pass myredis 123456
# 判定主节点下线的时长(毫秒)
# 如果主节点在30秒内没有响应,哨兵就认为它主观下线
# 格式: sentinel down-after-milliseconds master-name milliseconds
sentinel down-after-milliseconds myredis 30000
# 故障转移超时时间(毫秒)
# 当故障转移开始后,若超过此时间还未完成,则视为失败
# 格式: sentinel failover-timeout master-name milliseconds
sentinel failover-timeout myredis 180000
# 执行故障转移时,最多可以有多少个从节点同时对新的主节点进行同步
# 设置为 1 表示一次只有一个从节点进行同步,避免对新主节点造成过大压力
# 格式: sentinel parallel-syncs master-name num-slaves
sentinel parallel-syncs myre……
阅读全文