38

编辑:感谢 wiki 的链接,我认为既然它已经从那里开始,去那里查看它更容易。但是这里的问题也很好,所以不在 msdn 论坛周围的人可以了解 wiki 及其所在位置。

简短的问题:

您是否有可以帮助人们更好地理解它的 Rx 代码示例?

长篇大论隐藏的问题:

现在Rx 框架已经发布,我认为我们中的许多人都对获取这些位并尝试它们感兴趣。可悲的是,那里确实没有多少示例(经过详尽的搜索后,我几乎确信 Rx 只是为了在 wpf 应用程序上轻松拖动)。

我不记得我在哪里读到或听说过(我一直在看很多博客和视频)Rx 团队似乎有兴趣做 101 系列……当他们有足够的时间去做时......对于那些想要理解它并现在就玩它的人来说,这简直糟透了(我的意思是,当新技术出现时,自尊的开发人员不会觉得自己像一个拿着新玩具的孩子。像这样) .

我个人现在一直在尝试,但是哇,里面有一些疯狂的概念......只是有像MaterializeZip这样的方法名称让我想起了TeleportersBack to the Future 中的东西。

所以,我认为如果有更深入了解的人帮助建立一个示例集合,ala 101 Linq Examples从基本用法到更复杂的东西,并且几乎涵盖了所有方法及其用途,那就太好了,在一种实用的方法(也许还有一点理论,特别是因为这些概念可能需要它)

我认为 MS 开发人员花时间给我们提供这样的材料很棒,但我也认为这个社区足够好,可以开始构建我们自己的材料,不是吗?

4

6 回答 6

13

开始 - 这是一个简单的绘图应用程序,因此当用户拖动时,我们从鼠标初始位置到当前位置绘制一条红线,并在当前位置绘制一个蓝点。这是我上周对 Rx 进行 hack 的结果

WPF 绘图演示

这是源代码。

//A draw on drag method to perform the draw
void DrawOnDrag(Canvas e)
        {

            //Get the initial position and dragged points using LINQ to Events
            var mouseDragPoints = from md in e.GetMouseDown()
                                  let startpos=md.EventArgs.GetPosition(e)
                                  from mm in e.GetMouseMove().Until(e.GetMouseUp())
                                  select new
                                  {
                                      StartPos = startpos,
                                      CurrentPos = mm.EventArgs.GetPosition(e),
                                  };


            //Subscribe and draw a line from start position to current position
            mouseDragPoints.Subscribe
                (item =>
                {
                    e.Children.Add(new Line()
                    {
                        Stroke = Brushes.Red,
                        X1 = item.StartPos.X,
                        X2 = item.CurrentPos.X,
                        Y1 = item.StartPos.Y,
                        Y2 = item.CurrentPos.Y
                    });

                    var ellipse = new Ellipse()
                    {
                        Stroke = Brushes.Blue,
                        StrokeThickness = 10,
                        Fill = Brushes.Blue
                    };
                    Canvas.SetLeft(ellipse, item.CurrentPos.X);
                    Canvas.SetTop(ellipse, item.CurrentPos.Y);
                    e.Children.Add(ellipse);
                }
                );
        }

在此处阅读我的帖子并进行进一步说明并在此处下载源代码

希望这可以帮助

于 2009-11-21T05:41:22.773 回答
9

另一个有用的资源可能是Reactive Extensions (Rx) Koans55 个渐进式示例来帮助您学习 Rx

于 2012-02-16T09:54:17.110 回答
5

我正在阅读http://www.introtorx.com,顾名思义,它似乎是一个简洁的介绍。似乎有很多(非常基本的)示例,逐步进行,主要使用控制台打印内容。

于 2013-12-23T08:49:14.270 回答
4

这是我对Wes Dyer 的拖放示例的变体,用于 Windows 窗体(我可能将 EnableDragging 设为扩展方法):

    public Form2()
    {
        InitializeComponent();

        EnableDragging(pictureBox1);
        EnableDragging(button1);
        EnableDragging(this);
    }

    private void EnableDragging(Control c)
    {
        // Long way, but strongly typed.
        var downs = from down in Observable.FromEvent<MouseEventHandler, MouseEventArgs>(
                        eh => new MouseEventHandler(eh), 
                        eh => c.MouseDown += eh,  
                        eh => c.MouseDown -= eh)
                    select new { down.EventArgs.X, down.EventArgs.Y };

        // Short way.
        var moves = from move in Observable.FromEvent<MouseEventArgs>(c, "MouseMove")
                    select new { move.EventArgs.X, move.EventArgs.Y };

        var ups = Observable.FromEvent<MouseEventArgs>(c, "MouseUp");

        var drags = from down in downs
                    from move in moves.TakeUntil(ups)
                    select new Point { X = move.X - down.X, Y = move.Y - down.Y };

        drags.Subscribe(drag => c.SetBounds(c.Location.X + drag.X, c.Location.Y + drag.Y, 0, 0, BoundsSpecified.Location));
    }  
于 2009-11-21T19:36:45.983 回答
3

有点晚了,但是如果有人偶然发现了这个问题,http: //rxmarbles.com/提供了一种很好的方式来可视化操作符。

于 2017-07-11T14:07:42.053 回答
2

以及Github 上 的Stock Viewer示例在此处输入图像描述

  1. StreamProvider 从服务器提取数据并生成 Rx.NET IObservable 流。
  2. StreamAggregator 聚合所有 IObservable 流并将结果复制到中央处理线程中。
  3. 视图过滤单个流并将结果复制到它们自己的线程中以进行显示。

所有 StreamProviders、StreamAggregate 和 Views 都在它们自己的线程中运行。这也是现实世界股票查看应用程序的典型线程模型。

此示例也可以是 WPF DataGrid 的简单性能测试框架。它计算处理的滴答数/秒并将其显示在视图上。

于 2017-03-23T11:20:11.697 回答