2011-12-10 25 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を2度追加しました。しかし、ユーザーがフレームワークが更新できるよりも速くマウスを動かすと、マウスはコントロール領域の外に出て、コントロールも動かなくなります。

私はIMovableInterfaceを割り当て、メインフォームなどで移動しているコントロールのリストを保持することを考えていましたが、それはすべて面倒なことです...適切な解決策は何ですか?

P .:コントロールが動的に生成されるため、私はC#コードで解決策が必要であり、XMLでは解決されません。

答えて

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