使用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 @ 2011-11-07 13:49  YOYOFx  阅读(1513)  评论(0编辑  收藏  举报