我正在尝试使用Rx在wpf中实现标准的拖放图像。
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 :(得分:38)
名称空间System.Reactive.Linq
包含静态类Observable
,它定义了常见的无功组合器的所有扩展方法。它位于System.Reactive.dll
IObservable<T>.Subscribe
的{{1}}扩展方法,例如Subscribe(onNext)
,Subscribe(onNext, onError)
,在mscorlib
中的静态类System.ObservableExtensions
中定义。
tl;博士:
System.Reactive.Linq
= using System.Reactive.Linq;
System
= using System;
答案 1 :(得分:6)
为了更清楚地回答基于@Gideon Engelberths的评论第5题,我错过了'使用系统;'在我班上使用指令:
using System.Reactive.Linq;
using System;
然后修复了编译器问题。谢谢基甸。
答案 2 :(得分:0)
我只是偶然发现了这个问题,想补充一点,我必须添加更多对项目的引用。
在我的情况下,仅对System.Reactive.Linq
的引用是不够的。
添加了这三个后,编译器问题得到解决:
System.Reactive.Core
System.Reactive.Interfaces
System.Reactive.Linq
感谢@Gideon Engelberths的评论和参议员的回答。