Ошибка Невозможно преобразовать лямбда-выражение в подписку на IObservable <Point>

Я пытаюсь реализовать стандартное перетаскивание изображения в wpf с помощью Rx.

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);
            });

i получить ошибку Error Cannot convert lambda expression to type 'System.IObserver<System.Windows.Point>' because it is not a delegate type

что мне не хватает?

Ответы

Ответ 1

Пространство имен System.Reactive.Linq содержит статический класс Observable который определяет все методы расширения для общих реактивных комбинаторов. Он находится в System.Reactive.dll

Однако методы расширения для IObservable<T>.Subscribe такие как Subscribe(onNext), Subscribe(onNext, onError), определены в mscorlib в статическом классе System.ObservableExtensions.

ТЛ; др:

  • Для методов расширения Rx/Observable вам необходимо импортировать System.Reactive.Linq= using System.Reactive.Linq;
  • Для перегрузки подписки необходимо импортировать System= using System;

Ответ 2

Чтобы сделать это более ясным ответом, основанным на комментарии @Gideon Engelberths, в пятом вопросе, в котором я отсутствовал, "using System"; используя директиву в моем классе:

using System.Reactive.Linq;
using System;

Который затем исправил проблему с компилятором. Спасибо Гидеон.

Ответ 3

Я просто наткнулся на этот вопрос и хотел добавить, что мне нужно добавить больше ссылок на проект.
В моем случае одной ссылки на System.Reactive.Linq было недостаточно.

После добавления этих трех проблема с компилятором была решена:

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

Благодаря комментарию @Gideon Engelberths и ответу Senator.