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

时间:2022-06-09
本文章向大家介绍使用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框架的一小部分,想要了解更多的内容请上官方开发者中心看看。