Windows Forms 응용 프로그램이 있고 Rx를 사용하여 MouseMove 이벤트 스트림을 쿼리하고 마우스의 위치 (현재 및 이전)를 기반으로 결과를 생성합니다. 합니다 (LABEL1 결과를 보여주고 라벨 2는 현재 및 이전 위치로 "로그인"을 보여줍니다.)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(observable.Skip(1), Tuple.Create)
그래서, 왜이 발생? 그것을 고치는 방법?
값이 같으면 항상 -1을 얻습니다. ('currPosition.X> prevPosition.X'는 항상'false'를 반환합니다). 그래서 뭔가 다른 코드가 의심됩니다. 이것은 완전한 샘플입니까? –
Rx 쿼리에 문제가없는 것 같습니다. –
'Publish '도 사용하지 않으면'Zip' 예제가 작동하지 않을 것입니다. 그러나'Scan'은 괜찮습니다. ('스캔'은 내가 선호하는 페어링 방법입니다.) –