2015-08-22 61 views
1

我有一個家長控制,裏面有一個孩子。 現在我希望能夠通過在父母的周圍移動孩子

  1. 點擊以移動孩子周圍的家長裏就可以把它周圍
  2. 父某處點擊開始從點擊位置
  3. 按一下週圍拉在父母或孩子的地方設置孩子光標位置

我的父母和孩子,最初移動孩子,然後裝配的MouseMove處理程序給孩子和家長一個定義MouseDown事件。孩子和父母也有一個MouseUp處理程序,用於刪除MouseMove處理程序。即使MouseUp發生在窗口之外,或者如果窗口被alt + tab切離,我也希望MouseUp被調用。

這是我的代碼,它基本上工作,但不可靠。我經常在MM(MouseMove)被附加的情況下結束,但MouseUp或MouseDown不能再被調用,實質上是使我的應用程序死鎖。在該狀態下結束了一個辦法是

  1. 按父/子
  2. Alt + Tab鍵切換到另一個窗口
  3. 釋放鼠標盤旋而其他窗口

如何我是否正確實施了將其內部的孩子移動到父母的行爲?

我的孩子被稱爲滑塊。 此代碼位於我父母的代碼背後,這是我正在處理的自定義控件。

slider.MouseLeftButtonDown += MD; 
    MouseLeftButtonDown += MD; 

    slider.MouseUp += MU; 
    PreviewMouseUp += MU; 

    private void MM(object sender, MouseEventArgs meva) 
    { 
     double percentage = meva.GetPosition(this).Y/this.ActualHeight; 
     if (percentage <= 0) 
     { 
      Percentage = 0; 
      slider.Margin = new Thickness(0, -2, 0, 0); 
     } 
     else if (percentage >= 1) 
     { 
      Percentage = 1; 
      slider.Margin = new Thickness(0, this.ActualHeight - 2, 0, 0); 
     } 
     else 
     { 
      Percentage = percentage; 
      slider.Margin = new Thickness(0, meva.GetPosition(this).Y - 2, 0, 0); 
     } 
    } 
    // MouseDown Handler 
    private void MD(object sender, MouseButtonEventArgs e) 
    { 
     ReleaseMouseCapture(); // might be unnecessary? 
     MM(sender, e); // initial movement of child 
     this.CaptureMouse(); // To enable MouseUp outside 
     this.PreviewMouseMove += MM; 
     slider.PreviewMouseMove += MM; 
    } 
    // MouseUp Handler 
    private void MU(object sender, MouseButtonEventArgs e) 
    { 
     ReleaseMouseCapture(); 
     this.PreviewMouseMove -= MM; 
     slider.PreviewMouseMove -= MM; 
    } 

圖片相關的,什麼我的工作: enter image description here

回答

1

總結要在<Thumb>其在事件數據與Horizo​​ntalChange和VerticalChange一個DragDelta事件拖動的元素。看一看here

+0

Thumb舒適地處理所有的事件處理,但是有沒有辦法阻止它在一次拖放操作中累積HChange和VChange值並使用多次停止?就像我將它移動3個單位一樣,並且有三個事件,第一個包含VChange 1,第二個2和第三個3,當我希望所有三個事件都是1時(所有事件Vchange值總和導致移動單位的價值)。現在我總是保存最後的hc和vc值,並在實際使用過程中減去它們。我將它們設置爲DragStarted爲零。 – Traubenfuchs

+0

這很奇怪,正如鏈接中的示例所示,事件數據通常只包含自上次增量以來的增量 - 正是您需要的增量。它似乎爲我做了。也許編輯你的問題或者用你的所有代碼打開一個新的問題。 – PhilMasterG