2015-01-12 31 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,不符合條件。

有沒有辦法允許多鼠標移動事件發生,直到一個匹配條件發生?

回答

相關問題