2011-12-10 60 views
2

我有一個自定義的控制,我希望用戶能夠拖動它。所以我在自定義控件中輸入以下代碼:可移動的自定義控制

void MoveableStackPanel_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (IsMoving) 
     { 
      Point newLoc = e.GetPosition(null); 
      MainWindow.Instance.Title = newLoc.ToString(); // Debug 
      Margin = new Thickness(newLoc.X - 48, newLoc.Y - 48, 0, 0); 
     } 
    } 

請注意代碼中的「-48」。 當鼠標被移動向上或向左然後將鼠標不在控制區域不再並因此不不再觸發MouseMove事件。所以我加了-48兩次來解決這個問題。但是,當用戶移動鼠標比框架快可以更新鼠標將得到控制區域外,並且控制也將不再移動。

我在想分配一個IMovableInterface,並保持了在主窗體和這樣的移動控制列表,但是這是所有這些麻煩和這樣的...什麼是正確的解決方案?

P.S .:對照是動態產生的,所以我需要在XML在C#代碼的溶液,而不是。

回答

1

嘗試使用CaptureMouse Method

看看這樣的事情對你的作品:

void moveableStackPanel1_MouseUp(object sender, MouseButtonEventArgs e) 
    { 
     ReleaseMouseCapture(); 
    } 

    void moveableStackPanel1_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     if (IsEnabled && IsVisible) 
      CaptureMouse(); 
    } 

    void moveableStackPanel1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (IsMouseCaptured) 
     { 
      Point newLoc = e.GetPosition(null); 
      Margin = new Thickness(newLoc.X, newLoc.Y, 0, 0); 
     } 
    } 
+0

完美!奇蹟般有效。 – Napoleon