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作为一款强大的开源多媒体处理工具ÿ…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
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>…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
