2009-12-16 105 views
1

我需要一個控件來調用DragLevelButton上的DragMove(),但在點擊時仍然有效。C#WPF - DragMove並點擊

如果調用DragMove(),則不會觸發Click和MouseLeftButtonUp,因爲DragMove()是一個阻塞調用,直到它們釋放鼠標按鈕爲止。

有沒有人知道一個解決方法,使這項工作?

我曾嘗試基於此Thread.sleep代碼破解它允許一個點擊工作,如果它比100毫秒更快,但它沒有爲用戶可靠地工作:

   ThreadPool.QueueUserWorkItem(_ => 
        { 
         Thread.Sleep(100); 

         Dispatcher.BeginInvoke((Action) 
          delegate 
          { 
           if (Mouse.LeftButton == MouseButtonState.Pressed) 
           { 
            window.DragMove(); 
           } 
          }); 
        }); 

編輯:嗯,這黑客工作。 ..

   window.DragMove(); 
       RaiseEvent(new MouseButtonEventArgs(e.MouseDevice, e.Timestamp, MouseButton.Left) 
        { 
         RoutedEvent = MouseLeftButtonUpEvent 
        }); 

任何人都有更好的嗎?

+0

你在做什麼,需要點擊/鼠標拖動窗口? – 2009-12-16 19:51:14

+0

我們的設計在允許DragMove的角落有一個圖標,但是如果您點擊它,它會切換窗口部分面板的擴展。 – jonathanpeppers 2009-12-16 20:02:54

回答

0

如果你想要這兩個行爲,那麼你將不得不陷入鼠標向下和鼠標移動事件。在按下鼠標,可以保存當前鼠標位置:

StartPosition = event.GetPosition(ui_element); 

然後在鼠標移動,你只要鼠標按鈕仍下跌和鼠標已經移動到足以啓動一拖:

 if (e.LeftButton == MouseButtonState.Pressed) { 
     Point position = e.GetPosition(Scope); 
     if (Math.Abs(position.X - StartPoint.X) > SystemParameters.MinimumHorizontalDragDistance || 
      Math.Abs(position.Y - StartPoint.Y) > SystemParameters.MinimumVerticalDragDistance) { 
      StartDrag(e); 
     } 
    } 

的SystemParameters對象定義了Windows對移動是什麼的想法。

+0

StartDrag方法有什麼作用?你只是設置左側和頂部屬性?我認爲這會在XP上可怕地閃爍。 – jonathanpeppers 2009-12-17 14:02:45

+0

StartDrag()只是執行拖放操作的對象上的方法。我用當時需要的任何東西替換它,在你的情況下,你會調用DragMove()。這被剝離了一個Drap/Drop助手類,它可以做更多的事情。 – 2009-12-17 14:29:57

+0

然後你的例子不起作用。 DragMove()阻止MouseLeftButtonUp被解僱,除非你使用了我上面的一個竅門,而第二個目前的工作非常漂亮 - 這相當難看。 – jonathanpeppers 2009-12-17 15:03:59