2012-02-26 25 views
14

Tôi đang cố triển khai hình ảnh kéo và thả tiêu chuẩn trong wpf bằng Rx.Lỗi Không thể chuyển đổi biểu thức lambda trong đăng ký cho 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); 
      }); 

tôi nhận được Lỗi lỗi Cannot convert lambda expression to type 'System.IObserver<System.Windows.Point>' because it is not a delegate type

những gì tôi bị mất?

+0

Mã của bạn hoạt động tốt cho tôi. Bạn đã tham chiếu Rx-Main và Rx-WPF chưa? – Phil

+0

vâng tôi đã tham chiếu cả hai. –

+0

Hãy kiểm tra xem nền tảng mục tiêu của bạn có nói .NET 4 Client Profile không và sau đó thay đổi nó thành .NET 4. – Christoph

Trả lời

29

Không gian tên System.Reactive.Linq chứa lớp tĩnh Quan sát được xác định tất cả các phương pháp mở rộng cho bộ kết hợp phản ứng chung. Nó nằm trong System.Reactive.dll

Các phương pháp mở rộng cho IObservable<T>.Subscribe như Subscribe(onNext), Subscribe(onNext, onError) được tuy nhiên định nghĩa trong thư viện lõi trong lớp tĩnh System.ObservableExtensions.

tl; dr:

  • Đối với Rx bạn cần phải nhập khẩu System.Reactive.Linq = using System.Reactive.Linq;
  • Ví Theo dõi quá tải bạn cần phải nhập khẩu System = using System;
2

Để thực hiện một câu trả lời rõ ràng hơn này dựa trên @Gideon Engelberths bình luận thứ 5 trong câu hỏi tôi đã bỏ lỡ 'using System' sử dụng chỉ thị trong lớp của tôi:

using System.Reactive.Linq; 
using System; 

Sau đó, khắc phục sự cố trình biên dịch. Cảm ơn Gideon.

Các vấn đề liên quan