У меня есть следующий код, чтобы прослушать событие перетаскивания перетаскивания из WPF ListView. Идея состоит в том, что за событием мыши будет следовать ход мыши. Как только мышь переместится больше, чем минимальное расстояние, начнется действие перетаскивания.Обнаружение событий MouseDown и MouseMove с реактивными расширениями
var mouseDowns = Observable.FromEventPattern<MouseEventArgs>(this, "PreviewMouseDown");
var mouseMoves = Observable.FromEventPattern<MouseEventArgs>(this, "MouseMove").
Where(
x =>
x.EventArgs.LeftButton == MouseButtonState.Pressed ||
x.EventArgs.RightButton == MouseButtonState.Pressed);
var drag = from mouseDown in mouseDowns
from mouseMove in mouseMoves
let initialPosition = mouseDown.EventArgs.GetPosition(null)
let currentPosition = mouseMove.EventArgs.GetPosition(null)
let mouseDifference = initialPosition - currentPosition
//where
// (Math.Abs(mouseDifference.X) > MinimumDragDistance ||
// Math.Abs(mouseDifference.Y) > MinimumDragDistance)
select mouseDifference;
dragSubscription = drag.Subscribe(_ =>
{
Debug.WriteLine(string.Format("x: {0} y: {1}", _.X, _.Y));
var dataObject = GetDataObject();
DragDrop.DoDragDrop(this, dataObject, DragDropEffects.Move);
});
Проблема заключается в том, что в Linq, всякий раз, когда срабатывает событие PreviewMouseDown, что удовлетворяет критериям, только одно событие MouseMove ловится, а это означает, что, когда я включаю where
заявление в списке, mouseDifference всегда 0, что не соответствует этому условию.
Есть ли способ разрешить несколько событий mouseMove, до тех пор, пока не произойдет соответствие критериям?