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

Я пытаюсь реализовать стандартное перетаскивание изображения в 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);
            });

я получаю ошибку Ошибка Cannot convert lambda expression to type 'System.IObserver<System.Windows.Point>' because it is not a delegate type

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

Ответы [ 3 ]

39 голосов
/ 07 марта 2012

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

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

tl; др:

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

Чтобы сделать это более ясным ответом на основе комментария @Gideon Engelberths, 5-го в вопросе, я пропустил «использование системы»; используя директиву в моем классе:

using System.Reactive.Linq;
using System;

Что затем решило проблему с компилятором Спасибо Гедеон.

0 голосов
/ 30 января 2019

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

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

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

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

...