原文:WPF Interaction框架简介(一)——Behavior

在WPF 4.0中,引入了一个比较实用的库——Interactions,这个库主要是通过附加属性来对UI控件注入一些新的功能,除了内置了一系列比较好用的功能外,还提供了比较良好的扩展接口。本文这里简单的介绍一下Behavior这个扩展。

顾名思义,Behavior可以赋予控件新的行为能力,例如,我们可以通过MouseDragElementBehavior给控件附加上支持拖放的能力。使用方式如下:

  1. 添加Interactions库的引用。主要添加如下两个DLL:Microsoft.Expression.Interactions.dll和System.Windows.Interactivity.dll。
  2. 添加如下名字空间

    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
    xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"

  3. 在控件中添加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(实现得比较简单,并不完善),大体上关键的地方有如下三个:

  1. 通过AssociatedObject属性获取附加的对象。
  2. 通过重载OnAttached函数进行Behavior附加上时的初始化操作
  3. 通过重载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相关推荐

  1. 【转】.NET框架简介

    .NET 框架是由微软开发的软件开发平台,其最主要的两个组成部分是公共语言运行时 (CLR) 和框架类库 (FCL),基础类库 (BCL)是框架类库的一个子集. .NET 框架简介 下图展示了 .NE ...

  2. WPF 行为的用法(Behavior)

    WPF 行为的用法(Behavior) 行为的用法有些类似触发器的效果,但是触发器一般只能适用同一种的控件:而一个行为可以用在不同控件下(指定相同的父类): 示例: 注意先要添加引用System.Wi ...

  3. 第三方框架简介ios

    第三方框架简介iOS 图像 1.图片浏览控件MWPhotoBrowser 实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片 ...

  4. 【Spring】框架简介

    [Spring]框架简介 Spring是什么 Spring是分层的Java SE/EE应用full-stack轻量级开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Asp ...

  5. 《HiWind企业快速开发框架实战》(0)目录及框架简介

    <HiWind企业快速开发框架实战>(0)目录及框架简介 本系列主要介绍一款企业管理系统快速开发框架,该框架旨在快速完成企业管理系统,并实现易维护可移植的目标. 使用逐个系统模块进行编码的 ...

  6. go语言学习(二)——Gin 框架简介

    GoWeb开发有很多框架,如Beego.Gin.Revel.Echo.IRis等,学习框架可以快速做开发,对比常见goweb框架,通过其github的活跃度,维护的team,生产环境中的使用率以及师兄 ...

  7. Java开源——常见J2EE框架简介

    Java开源--常见J2EE框架简介 Spring Framework Spring是一个解决了许多在J2EE开发中常见的问题的强大框架. Spring提供了管理业务对象的一致方法并且鼓励了注入对接口 ...

  8. 【EventBus】EventBus 事件总线框架简介 ( EventBus 使用流程 )

    文章目录 一.EventBus 事件总线框架简介 二.EventBus 使用流程 一.EventBus 事件总线框架简介 Android 中的事件传递机制 : 使用 Intent 在组件间传递信息 ; ...

  9. 【Android 热修复】热修复原理 ( 热修复框架简介 | 将 Java 字节码文件打包到 Dex 文件 )

    文章目录 一. 热修复框架简介 1.类替换 2.so 替换 3.资源替换 4.全平台支持 5.生效时间 6.性能损耗 7.总结 二. 将 Java 字节码文件打包到 Dex 文件 一. 热修复框架简介 ...

最新文章

  1. [No0000A6]Visual Studio 2015 中的常用命令的默认键盘快捷键-VS2015 Shortcut
  2. 下拉框联动_058-ajax之三级联动案例分析
  3. dynamic_cast详解
  4. 获取Python安装目录
  5. 由异常掉电问题---谈xfs文件系统
  6. 数字信号处理----数字上变频和下变频都FPGA实现
  7. Android Window/Window Z-Order/Surface/SurfaceView
  8. web前端课程课件汇总
  9. 人脸关键点检测的思考
  10. Pr零基础入门指南笔记四
  11. PaddleOCR 识别器数据增强
  12. 如何优化在搜索引擎上的友好度
  13. Android自定义View 实现窗帘控件
  14. learning model 的演讲【转载】
  15. java8 两个时间比较
  16. nacl溶解度_科普下氯化钠溶解度
  17. adb devices 出现offline的无敌解决办法
  18. 文本文件编码与格式转换
  19. 农产品商城毕业设计,农产品销售系统毕业设计,农产品电商毕业设计论文方案需求分析作品参考
  20. C语言两班平均成绩,《统计学原理》复习参考(完整答案)

热门文章

  1. ASP.NET MVC基于标注特性的Model验证:DataAnnotationsModelValidator
  2. 人力资源中最常见的7张报表
  3. Shell编程中Shift的用法
  4. Ubuntu 创建文件快捷方式 启动器
  5. 枚举 + 进制转换 --- hdu 4937 Lucky Number
  6. 写在南加州留学生遇难之后
  7. 转 如何利用客户端缓存对网站进行优化?
  8. 百度启动高管退休计划,总裁张亚勤今年十月退休
  9. 企业运营对 DevOps 的「傲慢与偏见」
  10. c# for 应输入;