2012-02-26 32 views
14

Estoy tratando de implementar una imagen estándar de arrastrar y soltar en wpf con Rx.Error No se puede convertir la expresión lambda en suscribirse para un IObservable <Point>

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

consigo el error de error Cannot convert lambda expression to type 'System.IObserver<System.Windows.Point>' because it is not a delegate type

lo que me estoy perdiendo?

+0

Tu código funciona bien para mí. ¿Ha hecho referencia a Rx-Main y Rx-WPF? – Phil

+0

sí, me he referido a ambos. –

+0

Compruebe si su plataforma de destino indica .NET 4 Client Profile y en caso afirmativo, cámbielo a .NET 4. – Christoph

Respuesta

29

El espacio de nombres System.Reactive.Linq contiene la clase estática Observable que define todos los métodos de extensión para los combinadores reactivos comunes. Reside en System.Reactive.dll

Los métodos de extensión para IObservable<T>.Subscribe como Subscribe(onNext), Subscribe(onNext, onError) están sin embargo definidas en la biblioteca núcleo en la clase estática System.ObservableExtensions.

tl; dr:

  • Para Rx es necesario importar System.Reactive.Linq = using System.Reactive.Linq;
  • Para suscribirse sobrecargas que necesita para importar System = using System;
2

Para que esto sea una respuesta más clara basa en @Gideon Engelberths comentan en quinto lugar en la pregunta Me faltaba el 'sistema de uso'; usando la directiva en mi clase:

using System.Reactive.Linq; 
using System; 

Que solucionó el problema del compilador. Gracias Gideon.

Cuestiones relacionadas