2012-02-26 48 views
14

我正試圖在使用Rx的wpf中實現標準的拖放圖像。錯誤無法轉換訂閱IObservable中的lambda表達式<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); 
      }); 

我得到的錯誤錯誤Cannot convert lambda expression to type 'System.IObserver<System.Windows.Point>' because it is not a delegate type

我失去了什麼?

+0

您的代碼適合我。你是否引用了Rx-Main和Rx-WPF? – Phil 2012-02-26 16:16:37

+0

是的,我已經參考了兩個。 – 2012-02-26 16:43:57

+0

請檢查您的目標平臺是否說.NET 4客戶端配置文件,如果是,則將其更改爲.NET 4. – Christoph 2012-02-27 06:44:40

回答

29

名稱空間System.Reactive.Linq包含靜態類Observable,它定義了常用反應性組合器的所有擴展方法。它駐留在System.Reactive.dll

擴展方法IObservable<T>.SubscribeSubscribe(onNext)Subscribe(onNext, onError)被然而,在覈心庫在靜態類System.ObservableExtensions定義。

TL;博士:

  • Rx之中,你需要導入System.Reactive.Linq = using System.Reactive.Linq;
  • 對於訂閱您需要導入System = using System;
2

爲了使這是一個清晰的答案基於超載@Gideon Engelberths在我錯過了'使用系統'的問題中發表了第5條評論。在我的班級使用指令:

using System.Reactive.Linq; 
using System; 

然後修復了編譯器問題。感謝吉迪恩。

相關問題