使用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框架的一小部分,想要了解更多的内容请上官方开发者中心看看。
作者: YOYOFx
出处:https://www.cnblogs.com/maxzhang1985/p/12673160.html
版权:本文采用「署名-非商业性使用-相同方式共享 4.0 国际」知识共享许可协议进行许可。

分类:
XAML
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架