2015-01-12 3 views
1

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

ответ

Смежные вопросы