Ошибка Невозможно преобразовать лямбда-выражение в подписку на 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.