使用Rx Framework实现XAML中的物体拖动

酝酿两年之后,微软发布了Reactive Extensions(Rx)库。Rx把事件驱动UI与LINQ、并发性和异步调用结合起来。

Rx尝试解决从基于事件的UI异步访问数据的问题。标准的迭代器模式以及它的基本接口IEnumerable和IEnumerator对于异步操作是不足够的,因此Rx通过引入观察者模式来解决这个问题,这个模式包含两个主要的接口,IObservable和IObserver。不是客户端一步一步地迭代数据集合,而是集合把数据作为异步调用的结果推送给客户端,终结了调用循环。

接下来我们运用Rx的UI事件订阅功能来实现在WPF/Silverlight中拖动元素的功能函数:

 1   private void EnableDragging(FrameworkElement element)
 2   {
 3        var mousedown = from evt in Observable.FromEventPattern<MouseButtonEventArgs>(element, "MouseDown")
 4                               select evt.EventArgs.GetPosition(this);
 5 
 6        var mouseup = from evt in Observable.FromEventPattern<MouseButtonEventArgs>(this, "MouseUp")
 7                             select evt.EventArgs.GetPosition(this);
 8 
 9        var mousemove = from evt in Observable.FromEventPattern<MouseEventArgs>(this, "MouseMove")
10                              select evt.EventArgs.GetPosition(this);
11 
12        var elementMoves = from start in mousedown
13                            from pos in mousemove.StartWith(start).TakeUntil(mouseup)
14                            select pos;
15 
16         elementMoves.Subscribe(value =>{
17                 Canvas.SetLeft(element, value.X - element.Width/2);
18                 Canvas.SetTop(element, value.Y - element.Height/2);
19             });
20  }

短短几行代码就实现了我们想要完成的功能,而且在语义上也非常容易理解。

当然这只是Rx框架的一小部分,想要了解更多的内容请上官方开发者中心看看。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python小屋

Python使用pycuda在GPU上并行处理批量判断素数

借助于扩展库pycuda,可以在Python中访问NVIDIA显卡提供的CUDA并行计算API,使用非常方便。安装pycuda时要求已正确安装合适版本的CUDA...

45530
来自专栏逸鹏说道

C# 窗体常用API函数 应用程序窗体查找

常用的处理窗体的API函数如下(注意:API函数必须放在窗体中...): 使用C#语言,要引用DllImport,必须要添加using System.Runti...

55560
来自专栏Scott_Mr 个人专栏

RxSwift 实战操作【注册登录】

40760
来自专栏博客园

讲一下Asp.net core MVC2.1 里面的 ApiControllerAttribute

转自:https://www.cnblogs.com/sheldon-lou/p/9495377.html

12220
来自专栏MasiMaro 的技术博文

PE文件详解(四)

本文转自小甲鱼的PE文件详解系列原文传送门 到此为止,小甲鱼和大家已经学了许多关于 DOS header 和 PE header 的知识。接下来就该轮到Se...

15810
来自专栏学海无涯

Java Web之Servlet获取表单值

Java Web开发中,最常用的就是在后台获取前台的参数,经典的案例就是 JSP 表单传值到后台的 Servlet,然后在 doGet 或者 doPost 中获...

37040
来自专栏JackieZheng

探秘Tomcat——连接器和容器的优雅启动

前言: 上篇《探秘Tomcat——启动篇》粗线条的介绍了在tomcat在启动过程中如何初始化Bootstrap类,加载并执行server,从而启动整个tomc...

24580
来自专栏图形学与OpenGL

MessageBox和AfxMessageBox函数的区别(ZZ)

AfxMessageBox(“Are you sure?”,MB_YESNO|MB_ICONQUESTION); 2.与AfxMessageBox类似...

11140
来自专栏一个爱瞎折腾的程序猿

winform制作小工具的技巧

在使用winfrom制作一些工具的时候,一些基本设置都是去属性里面找来找去,一段时间就忘了,记录记录以备不时之需。

22230
来自专栏逆向技术

64位内核第二讲,进程保护之对象钩子

         64位内核第二讲,进程保护. 一丶什么是保护. 什么是保护. 比如我们安装了xxx杀毒软件.那么此时你用任务管理器关闭.是关闭不了的.原因是内...

35460

扫码关注云+社区

领取腾讯云代金券