我有一個Windows窗體應用程序,我使用Rx查詢MouseMove事件流並根據鼠標的位置(當前和以前)生成結果。我的代碼如下所示: (該label1的顯示結果和label2顯示「登錄」當前和以前的位置。)比較MouseMove事件流,鼠標位置不會減少
var observable = Observable.FromEventPattern<MouseEventArgs>(this, "MouseMove");
observable
.PairWithPrevious()
.Select(tuple =>
{
if (tuple.Item2 == null || tuple.Item1 == null) return Tuple.Create(0, 0);
var currPosition = tuple.Item2.EventArgs.Location;
var prevPosition = tuple.Item1.EventArgs.Location;
var x = 0;
if (currPosition.X > prevPosition.X) x = 1;
else if (currPosition.X < prevPosition.X) x = -1;
var y = 0;
if (currPosition.Y > prevPosition.Y) y = 1;
else if (currPosition.Y < prevPosition.Y) y = -1;
label2.Text = string.Format("Curr X: {0} * Y: {1} |||| Prev X: {2} * Prev Y: {3}", currPosition.X, currPosition.Y, prevPosition.X, prevPosition.Y);
return Tuple.Create(x, y);
})
.Subscribe(x =>
{
label1.Text = string.Format("X: {0} ** Y: {1}", x.Item1, x.Item2);
});
的PairWithPrevious功能:
public static IObservable<Tuple<TSource, TSource>> PairWithPrevious<TSource>(this IObservable<TSource> source)
{
return source.Scan(
Tuple.Create(default(TSource), default(TSource)),
(acc, current) => Tuple.Create(acc.Item2, current));
}
的問題是:當將鼠標向左或向上移動,前一個和當前(x,y)值相同,結果(label1)從不顯示「-1」值。
我以比較以前和當前值使用Zip功能嘗試,但結果是一樣的:
Zip(observable.Skip(1), Tuple.Create)
那麼,爲什麼會出現呢?以及如何解決它?
如果他們是相同的值,那麼你總是會得到-1。 ('currPosition.X> prevPosition.X'將總是返回'false')。所以我懷疑你的代碼還有其他問題。這是完整的樣本嗎? –
請注意,它似乎不是您的Rx查詢的問題。 –
你的'Zip'例子不會工作,除非你也使用'Publish',但是'Scan'很好。 ('掃描'是我最喜歡的配對方式。) –