使用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框架的一小部分,想要了解更多的内容请上官方开发者中心看看。

posted @   YOYOFx  阅读(1519)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示