У меня есть следующий код, чтобы прослушать запуск события перетаскивания из WPF ListView. Идея состоит в том, что за событием мыши будет следовать ход мыши. Как только мышь переместится больше, чем минимальное расстояние, начнется действие перетаскивания.
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, до тех пор, пока не произойдет соответствие критериям?
Я смог ответить на вопрос с помощью образца кода в следующем вопросе: