wpf 基于Behavior库 的行为模块
Microsoft.Xaml.Behaviors
是一个用于WPF(Windows Presentation Foundation)的行为库,它的主要作用是允许开发者在不修改控件源代码的情况下,为控件添加自定义的行为和交互逻辑。行为库的核心思想是通过定义可重用的行为组件,将交互逻辑与UI控件解耦,从而提高代码的可维护性和可复用性。
1. 增强控件功能
- 无需修改控件源码:在WPF中,控件的功能通常是固定的,但如果需要扩展控件的功能(例如为按钮添加双击事件、为文本框添加自动完成功能等),可以通过行为库来实现,而无需修改控件的源代码。
- 动态添加行为:行为可以动态地附加到控件上,并在运行时生效,非常适合需要灵活交互的场景。
2. 将交互逻辑与UI解耦
- 行为与UI分离:行为库使得交互逻辑与UI控件分离,开发者可以在不侵入控件代码的情况下,为控件添加自定义逻辑。
- 行为复用:一旦定义了一个行为,它可以被多次复用到不同的控件上,减少了重复代码的编写。
3. 简化复杂的交互逻辑
- 复杂交互的封装:某些复杂的交互逻辑(例如拖放操作、窗口关闭时的特殊处理、动画触发等)可以通过行为库封装为一个独立的行为,而不是直接写入控件的事件处理程序中。
- 避免事件处理代码膨胀:使用行为库可以将事件处理逻辑集中管理,避免在代码背后堆积大量的事件处理代码。
4. 支持MVVM模式
- MVVM的桥梁:在MVVM模式中,
Behavior
可以作为视图(View)和视图模型(ViewModel)之间的桥梁。行为可以直接绑定到ViewModel中的命令(ICommand
),从而将用户的交互操作(例如按钮点击、窗口关闭等)映射到ViewModel中的业务逻辑。 - 减少代码背后的复杂性:在MVVM中,行为可以代替代码背后的逻辑(例如事件处理程序),使得代码更加清晰和简洁。
5. 灵活性和可扩展性
- 自定义行为:开发者可以根据需求创建自定义的行为类,继承自
Behavior<T>
(其中T
是目标控件的类型,例如Button
、TextBox
、Window
等)。 - 内置行为:
Microsoft.Xaml.Behaviors
库还包含一些预定义的行为,例如EventTrigger
、InvokeCommandAction
等,可以直接使用。
6. 与XAML无缝集成
- 在XAML中使用行为:行为库可以与XAML无缝集成,开发者可以直接在XAML中为控件附加行为,而不需要编写C#代码。
<Button><i:Interaction.Behaviors><behaviors:MyCustomBehavior /></i:Interaction.Behaviors> </Button>
- 绑定支持:行为可以绑定到ViewModel中的命令或属性,使得行为逻辑可以动态变化。
示例:使用行为库的场景
- 拖放操作:为控件添加拖放行为。
- 窗口关闭时的特殊处理:如您提供的代码示例,当窗口关闭时,可以执行自定义命令(例如隐藏窗口而不是关闭它)。
- 按钮双击事件:为按钮添加双击行为,而不需要修改按钮的默认行为。
- 动画触发:当某个事件发生时(例如鼠标悬停),触发控件的动画。
- 自动完成:为文本框添加自动完成行为。
窗口关闭时的特殊处理
附加属性快捷键 :
propdp
public static readonly DependencyProperty ClosingActionProperty =DependencyProperty.Register("ClosingAction", // 属性名称typeof(ICommand), // 属性类型typeof(HideViewBehavior), // 属性的宿主类 这里指定依赖属性的宿主类是 HideViewBehavior,表示这个依赖属性是属于 HideViewBehavior 类的。new PropertyMetadata(null) // 属性元数据 默认值为null);
using CommunityToolkit.Mvvm.Input;
using Microsoft.Xaml.Behaviors;
using System.Windows;
using System.Windows.Input;namespace BehaviorsModule
{public class HideViewBehavior : Behavior<Window>{public ICommand ClosingAction{get { return (ICommand)GetValue(ClosingActionProperty); }set { SetValue(ClosingActionProperty, value); }}public static readonly DependencyProperty ClosingActionProperty =DependencyProperty.Register("ClosingAction", typeof(ICommand), typeof(HideViewBehavior), new PropertyMetadata(null));protected override void OnAttached(){base.OnAttached();AssociatedObject.Closing += AssociatedObject_Closing;}private void AssociatedObject_Closing(object? sender, System.ComponentModel.CancelEventArgs e){e.Cancel = true;if (ClosingAction != null){ClosingAction.Execute(new object());}}}
}
给控件添加拖放操作
using Microsoft.Xaml.Behaviors;
using System.Windows;
using System.Windows.Input;namespace BehaviorsModule
{public class MoveViewBehavior: Behavior<Window>{protected override void OnAttached(){base.OnAttached();AssociatedObject.PreviewMouseDown += AssociatedObject_PreviewMouseDown;AssociatedObject.PreviewMouseMove += AssociatedObject_PreviewMouseMove;AssociatedObject.PreviewMouseLeftButtonUp += AssociatedObject_PreviewMouseLeftButtonUp;}private void AssociatedObject_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e){if (_isDragMoved){_isDragMoved = false;e.Handled = true;}}private void AssociatedObject_PreviewMouseMove(object sender, MouseEventArgs e){if (Mouse.LeftButton == MouseButtonState.Pressed && _pressedPosition != e.GetPosition(AssociatedObject)){_isDragMoved = true;AssociatedObject.DragMove();}}Point _pressedPosition;bool _isDragMoved = false;private void AssociatedObject_PreviewMouseDown(object sender, MouseButtonEventArgs e){_pressedPosition = e.GetPosition(AssociatedObject);}}
}
初始化窗体位置
public class InitViewPostionBehavior : Behavior<Window>{public double xp{get { return (double)GetValue(xpProperty);}set { SetValue(xpProperty, value); }}// Using a DependencyProperty as the backing store for xp. This enables animation, styling, binding, etc...public static readonly DependencyProperty xpProperty =DependencyProperty.Register("xp", typeof(double), typeof(InitViewPostionBehavior), new PropertyMetadata(0.0));public double yp{get { return (double)GetValue(ypProperty); }set { SetValue(ypProperty, value); }}// Using a DependencyProperty as the backing store for yp. This enables animation, styling, binding, etc...public static readonly DependencyProperty ypProperty =DependencyProperty.Register("yp", typeof(double), typeof(InitViewPostionBehavior), new PropertyMetadata(0.0));private void InitializeFormPosition(){var workingArea = SystemParameters.WorkArea;double screenWidth = workingArea.Width;double screenHeight = workingArea.Height;double x = screenWidth / xp;double y = screenHeight / yp;AssociatedObject.Left = x;AssociatedObject.Top = y;}protected override void OnAttached(){base.OnAttached();InitializeFormPosition();}}
相关文章:
wpf 基于Behavior库 的行为模块
Microsoft.Xaml.Behaviors 是一个用于WPF(Windows Presentation Foundation)的行为库,它的主要作用是允许开发者在不修改控件源代码的情况下,为控件添加自定义的行为和交互逻辑。行为库的核心思想是通过定义可重用的行为组件&…...

【每日学点鸿蒙知识】导入cardEmulation、自定义装饰器、CallState状态码顺序、kv配置、签名文件配置
1、HarmonyOS 无法导入cardEmulation? 在工程entry mudule里的index.ets文件里导入cardEmulation失败 可以按照下面方式添加SystemCapability;在src/main/syscap.json(此文件需要手动创建)中添加如下内容 {"devices": {"gen…...
【SpringMVC】REST 风格
REST(Representational State Transfer,表现形式状态转换)是一种访问网络资源的格式。传统的资源描述方式通常如下: http://localhost/user/getById?id1http://localhost/user/saveUser 而 REST 风格的描述则更简洁:…...

IDEA修改编译版本
目录 一、序言 二、修改maven配置 1.修改 2.代码 三、pom文件配置 1.修改 2.代码 3.问题 一、序言 有两种方法可以帮助大家解决IDEA每次刷新maven的pom配置时,会发生发行源版本不正常的报错。个人推荐第二种,原因:第二种你刷新maven后…...
SkyWalking Agent 配置 Spring Cloud Gateway 插件解决日志错误
SkyWalking Agent 配置 Spring Cloud Gateway 插件解决日志错误 IDEA中启动网管时,需要配置VM启动参数,格式如下: # 配置 SkyWalking Agent 启动参数,以便将网关服务的性能数据上报到 SkyWalking 服务器。 -javaagent:/path/to/sk…...

canvas+fabric实现时间刻度尺(一)
前言 需求:显示一个时间刻度尺,鼠标移动会显示当前时间 技术:我们采用canvasfabric进行实现 效果 实现 1.创建canvas(设置宽高)设为全局变量 2.引入fabric包 3.画时间刻度尺(长方形横线) …...

傲雷亮相2024中国时尚体育季(珠海站),展现户外移动照明风采
2024年12月28-29日,2024中国时尚体育季(珠海站)国家级轮滑比赛在珠海金山体育公园成功举办。作为户外创新型移动照明领域的领导品牌,傲雷受邀参加了本次珠海金湾运动生活嘉年华的展览单元,与众多户外运动品牌同台展示。…...
YOLOv10-1.1部分代码阅读笔记-block.py
block.py ultralytics\nn\modules\block.py 目录 block.py 1.所需的库和模块 2.class DFL(nn.Module): 3.class Proto(nn.Module): 4.class HGStem(nn.Module): 5.class HGBlock(nn.Module): 6.class SPP(nn.Module): 7.class SPPF(nn.Module): 8.class C1(nn…...
@RestControllerAdvice注解
RestControllerAdvice 是 Spring 4 引入的一个组合注解,它结合了 ControllerAdvice 和 ResponseBody,专门用于处理 RestController 类型的控制器中的全局异常、全局数据绑定和全局模型属性等问题。在 Spring Boot 中,RestControllerAdvice 通…...
Enum枚举类与静态变量和静态数组的区别
Enum枚举类与静态变量和静态数组的区别 组成结构Enum枚举类静态变量静态数组 组成结构的区别相同之处不同之处 用法使用相同之处不同之处 组成结构 先来看下Enum枚举类,静态变量,静态数组的初始化过程,以下面为例子: public enu…...

uniapp——微信小程序读取bin文件,解析文件的数据内容(三)
微信小程序读取bin文件内容 读取用户选择bin文件,并解析数据内容,分包发送给蓝牙设备; 文章目录 微信小程序读取bin文件内容读取文件读取内容返回格式 API文档: getFileSystemManager 关于App端读取bin文件,请查看&…...
SpringBoot集成ECDH密钥交换
简介 对称加解密算法都需要一把秘钥,但是很多情况下,互联网环境不适合传输这把对称密码,有密钥泄露的风险,为了解决这个问题ECDH密钥交换应运而生 EC:Elliptic Curve——椭圆曲线,生成密钥的方法 DH&…...
python文件操作相关(excel)
python文件操作相关(excel) 1. openpyxl 库openpyxl其他用法创建与删除操作单元格追加数据格式化单元格合并单元格插入图片公式打印设置保护工作表其他功能 2. pandas 库3. xlrd 和 xlwt 库4. xlsxwriter 库5. pyxlsb 库应用场景参考资料 在 Python 中&a…...

探索React与Microi吾码的完美结合:快速搭建项目,低代码便捷开发教程
一、摘要 在当今的数字化时代,软件开发就像是一场探险,每个开发者都是探险家,探索着代码的奥秘。React作为前端开发的领军框架,其组件化和高效的渲染机制为开发者提供了强大的工具。而Microi吾码低代码平台的出现,则为…...

【面试系列】深入浅出 Spring Boot
熟悉SpringBoot,对常用注解、自动装配原理、Jar启动流程、自定义Starter有一定的理解; 面试题 Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?Spring Boot的自动配置原理是什么?你如何理解 Spring Boot 配置…...
@colyseus/social 模块详解
@colyseus/social 模块介绍 @colyseus/social 是一个适用于 Colyseus 游戏框架的扩展模块,提供了社交功能的支持,帮助开发者在多人游戏中快速实现玩家之间的社交互动。它主要提供了玩家账户管理、好友系统、好友请求、组队和聊天功能等,旨在简化游戏中社交功能的实现。 核心…...

石岩路边理发好去处
周末带娃去罗租公园玩,罗租公园旁边就是百佳华和如意豪庭小区,发现如意豪庭小区对面挺多路边理发摊点 理发摊点聚焦在这里的原因是刚好前面城管来了暂时避避,例如还有一个阿姨剪到一半就跟着过来。这里的城管只是拍了一处没有摊位的地方&…...

ROS 2中的DDS中间件
文章目录 一、简介二、默认支持的 DDS (Data Distribution Service) 实现三、切换DDS实现小结 一、简介 中间件是一个软件层,通常用于连接不同的应用程序、服务或系统,以便它们能够相互通信和交换数据。中间件并不直接向用户暴露,而是在系统…...

「下载」智慧文旅运营综合平台解决方案:整体架构,核心功能设计
智慧文旅运营综合平台,旨在通过集成大数据、云计算、物联网、人工智能等先进技术,为景区、旅游企业及相关管理机构提供一站式的智慧化运营服务。 智慧文旅运营综合平台不仅能够提升游客的游览体验,还能帮助景区管理者实现资源的优化配置和业务…...

NVR小程序接入平台EasyNVR使用FFmpeg取流时提示错误是什么原因呢?
在视频监控系统中,FFmpeg常用于从各种源(如摄像头、文件、网络流等)获取流媒体数据,这个过程通常称为“取流”。 在EasyNVR平台中,使用FFmpeg取流是一种常见的操作。FFmpeg作为一款强大的开源多媒体处理工具ÿ…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
Go语言多线程问题
打印零与奇偶数(leetcode 1116) 方法1:使用互斥锁和条件变量 package mainimport ("fmt""sync" )type ZeroEvenOdd struct {n intzeroMutex sync.MutexevenMutex sync.MutexoddMutex sync.Mutexcurrent int…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...