WPF Interaction框架简介(一)——Behavior
在WPF 4.0中,引入了一个比较实用的库——Interactions,这个库主要是通过附加属性来对UI控件注入一些新的功能,除了内置了一系列比较好用的功能外,还提供了比较良好的扩展接口。本文这里简单的介绍一下Behavior这个扩展。
顾名思义,Behavior可以赋予控件新的行为能力,例如,我们可以通过MouseDragElementBehavior给控件附加上支持拖放的能力。使用方式如下:
- 添加Interactions库的引用。主要添加如下两个DLL:Microsoft.Expression.Interactions.dll和System.Windows.Interactivity.dll。
- 添加如下名字空间
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" - 在控件中添加MouseDragElementBehavior
<Image Source="2.jpg" ><i:Interaction.Behaviors><ei:MouseDragElementBehavior/></i:Interaction.Behaviors></Image>
这三步中前面几步都是添加Interactions库的支持,对于后面介绍的Trigger和Action也是一样的,只有<ei:MouseDragElementBehavior/>一句才是和Behavior相关的。实际上,我们可以通过在Blend里直接将MouseDragElementBehavior拖放到控件上简化这一过程。加上MouseDragElementBehavior后,我们的控件就支持鼠标拖拽移动了,非常给力。
实际上,系统还提供了一系列非常好用的Behavior,后面我再单独写文章来介绍它。
编写自己的Behavior
除了系统自己提供的Behavior外,我们也可以通过自己编写Behavior来实现自定义行为,一个简单的示例如下:
class SkewBehavior : Behavior<UIElement>{SkewTransform _transForm;protected override void OnAttached(){base.OnAttached();_transForm = new SkewTransform();AssociatedObject.RenderTransform = _transForm;AssociatedObject.RenderTransformOrigin = new Point(0.5, 0.5);_transForm.AngleX = 30;}protected override void OnDetaching(){_transForm.AngleX = 0;base.OnDetaching();}}
View Code
上面的代码同样实现了一个将控件水平方向倾斜30度的Behavior(实现得比较简单,并不完善),大体上关键的地方有如下三个:
- 通过AssociatedObject属性获取附加的对象。
- 通过重载OnAttached函数进行Behavior附加上时的初始化操作
- 通过重载OnDetaching函数进行移除Behavior时候的析构操作
虽然我们也可以直接通过附加属性实现这样的功能,但Interactions框架无疑规范并简化了这一行为。
最后,附上一个比较常用的鼠标拖放的Behavior,和内置的MouseDragElementBehavior不同的是,它产生鼠标事件,用于实现一些自定义的拖放操作:
class DragDropBehavior : Behavior<UIElement>{public event EventHandler<DragDeltaEventArgs> DragDelta;public event EventHandler<EventArgs> Drop;IInputElement _parent;protected override void OnAttached(){base.OnAttached();_parent = LogicalTreeHelper.GetParent(AssociatedObject) as IInputElement;if (_parent == null)return;AssociatedObject.MouseLeftButtonDown += onMouseDown;AssociatedObject.MouseMove += onMouseMove;AssociatedObject.MouseLeftButtonUp += onMouseUp;AssociatedObject.MouseEnter += onDragEnter;}protected override void OnDetaching(){AssociatedObject.MouseLeftButtonDown -= onMouseDown;AssociatedObject.MouseMove -= onMouseMove;AssociatedObject.MouseLeftButtonUp -= onMouseUp;AssociatedObject.MouseEnter -= onDragEnter;base.OnDetaching();}Point? start;private void onMouseDown(object sender, MouseButtonEventArgs e){start = Mouse.GetPosition(_parent);}private void onMouseMove(object sender, MouseEventArgs e){if (!start.HasValue)return;var p = Mouse.GetPosition(_parent);var offset = p - start.Value;start = p;DragDelta?.Invoke(AssociatedObject, new DragDeltaEventArgs(offset.X, offset.Y));}private void onMouseUp(object sender, MouseButtonEventArgs e){tryEndDrag();}private void onDragEnter(object sender, MouseEventArgs e){tryEndDrag();}void tryEndDrag(){if (Mouse.LeftButton != MouseButtonState.Released)return;start = null;Drop?.Invoke(AssociatedObject, EventArgs.Empty);}}
View Code
WPF Interaction框架简介(一)——Behavior相关推荐
- 【转】.NET框架简介
.NET 框架是由微软开发的软件开发平台,其最主要的两个组成部分是公共语言运行时 (CLR) 和框架类库 (FCL),基础类库 (BCL)是框架类库的一个子集. .NET 框架简介 下图展示了 .NE ...
- WPF 行为的用法(Behavior)
WPF 行为的用法(Behavior) 行为的用法有些类似触发器的效果,但是触发器一般只能适用同一种的控件:而一个行为可以用在不同控件下(指定相同的父类): 示例: 注意先要添加引用System.Wi ...
- 第三方框架简介ios
第三方框架简介iOS 图像 1.图片浏览控件MWPhotoBrowser 实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片 ...
- 【Spring】框架简介
[Spring]框架简介 Spring是什么 Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Asp ...
- 《HiWind企业快速开发框架实战》(0)目录及框架简介
<HiWind企业快速开发框架实战>(0)目录及框架简介 本系列主要介绍一款企业管理系统快速开发框架,该框架旨在快速完成企业管理系统,并实现易维护可移植的目标. 使用逐个系统模块进行编码的 ...
- go语言学习(二)——Gin 框架简介
GoWeb开发有很多框架,如Beego.Gin.Revel.Echo.IRis等,学习框架可以快速做开发,对比常见goweb框架,通过其github的活跃度,维护的team,生产环境中的使用率以及师兄 ...
- Java开源——常见J2EE框架简介
Java开源--常见J2EE框架简介 Spring Framework Spring是一个解决了许多在J2EE开发中常见的问题的强大框架. Spring提供了管理业务对象的一致方法并且鼓励了注入对接口 ...
- 【EventBus】EventBus 事件总线框架简介 ( EventBus 使用流程 )
文章目录 一.EventBus 事件总线框架简介 二.EventBus 使用流程 一.EventBus 事件总线框架简介 Android 中的事件传递机制 : 使用 Intent 在组件间传递信息 ; ...
- 【Android 热修复】热修复原理 ( 热修复框架简介 | 将 Java 字节码文件打包到 Dex 文件 )
文章目录 一. 热修复框架简介 1.类替换 2.so 替换 3.资源替换 4.全平台支持 5.生效时间 6.性能损耗 7.总结 二. 将 Java 字节码文件打包到 Dex 文件 一. 热修复框架简介 ...
最新文章
- [No0000A6]Visual Studio 2015 中的常用命令的默认键盘快捷键-VS2015 Shortcut
- 下拉框联动_058-ajax之三级联动案例分析
- dynamic_cast详解
- 获取Python安装目录
- 由异常掉电问题---谈xfs文件系统
- 数字信号处理----数字上变频和下变频都FPGA实现
- Android Window/Window Z-Order/Surface/SurfaceView
- web前端课程课件汇总
- 人脸关键点检测的思考
- Pr零基础入门指南笔记四
- PaddleOCR 识别器数据增强
- 如何优化在搜索引擎上的友好度
- Android自定义View 实现窗帘控件
- learning model 的演讲【转载】
- java8 两个时间比较
- nacl溶解度_科普下氯化钠溶解度
- adb devices 出现offline的无敌解决办法
- 文本文件编码与格式转换
- 农产品商城毕业设计,农产品销售系统毕业设计,农产品电商毕业设计论文方案需求分析作品参考
- C语言两班平均成绩,《统计学原理》复习参考(完整答案)