错误无法在订阅IObservable <point> </point>时转换lambda表达式

时间:2012-02-26 14:46:14

标签: wpf lambda system.reactive

我正在尝试使用Rx在wpf中实现标准的拖放图像。

var mouseDown = from evt in Observable.FromEventPattern<MouseButtonEventArgs>(image, "MouseLeftButtonDown")
                          select evt.EventArgs.GetPosition(image);

            var mouseUp = Observable.FromEventPattern<MouseButtonEventArgs>(this, "MouseLeftButtonUp");

            var mouseMove = from evt in Observable.FromEventPattern<MouseEventArgs>(this, "MouseMove")
                            select evt.EventArgs.GetPosition(this);

            var q = from startLocation in mouseDown
                    from endLocation in mouseMove.TakeUntil(mouseUp)
                    select new Point 
                    {
                        X = endLocation.X - startLocation.X,
                        Y = endLocation.Y - startLocation.Y
                    };

            q.ObserveOn(SynchronizationContext.Current).Subscribe(point =>
            {
                Canvas.SetLeft(image, point.X);
                Canvas.SetTop(image, point.Y);
            });

我收到错误错误Cannot convert lambda expression to type 'System.IObserver<System.Windows.Point>' because it is not a delegate type

我错过了什么?

3 个答案:

答案 0 :(得分:38)

名称空间System.Reactive.Linq包含静态类Observable,它定义了常见的无功组合器的所有扩展方法。它位于System.Reactive.dll

IObservable<T>.Subscribe的{​​{1}}扩展方法,例如Subscribe(onNext)Subscribe(onNext, onError),在mscorlib中的静态类System.ObservableExtensions中定义。

tl;博士:

  • 对于Rx / Observable扩展方法,您需要导入System.Reactive.Linq = using System.Reactive.Linq;
  • 对于订阅重载,您需要导入System = using System;

答案 1 :(得分:6)

为了更清楚地回答基于@Gideon Engelberths的评论第5题,我错过了'使用系统;'在我班上使用指令:

using System.Reactive.Linq;
using System;

然后修复了编译器问题。谢谢基甸。

答案 2 :(得分:0)

我只是偶然发现了这个问题,想补充一点,我必须添加更多对项目的引用。
在我的情况下,仅对System.Reactive.Linq的引用是不够的。

添加了这三个后,编译器问题得到解决:

  • System.Reactive.Core
  • System.Reactive.Interfaces
  • System.Reactive.Linq

感谢@Gideon Engelberths的评论和参议员的回答。