Spiga

WPF学习笔记5:MVVM

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…… 阅读全文

WPF学习笔记4:控件模版

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. 建…… 阅读全文

WPF学习笔记3:基本布局

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 …… 阅读全文

WPF学习笔记2:3D绘图

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…… 阅读全文

WPF学习笔记1:基础控件

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:无边…… 阅读全文

Kafka知识点总结

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…… 阅读全文

RabbitMQ群集安装

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 开…… 阅读全文

RabbitMQ知识点总结

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…… 阅读全文

MongoDB知识点总结

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: …… 阅读全文

Redis哨兵集群文档

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…… 阅读全文

上一页 1 ... 3 4 5 6 7 ... 31 下一页