WPF中的可移动UserControl

时间:2012-04-12 08:29:11

标签: c# wpf user-controls mouseevent move

我创建了带有多个标签的简单UserControl。如何实现简单的机制,允许像普通窗口一样移动整个控件(当我将它添加到winForms时 - 如果它有所不同)

2 个答案:

答案 0 :(得分:3)

前段时间我遇到了同样的问题,this article on codeproject给了我很多帮助。

答案 1 :(得分:2)

您可以使用我的Capture类:

public class ClsCapture
{
    bool bCaptureMe;
    Point pLocation = new Point();

    Control dd;
    //Handles dad.MouseDown, dd.MouseDown
    private void Form1_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        try {
            bCaptureMe = true;
            pLocation = e.GetPosition(sender);
        } catch {
        }
    }

    //Handles dad.MouseMove, dd.MouseMove
    private void Form1_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
    {
        try {

            if (bCaptureMe) {
                dd.Margin = new Thickness(dd.Margin.Left - pLocation.X + e.GetPosition(sender).X, dd.Margin.Top - pLocation.Y + e.GetPosition(sender).Y, dd.Margin.Right, dd.Margin.Bottom);

            }
        } catch {
        }
    }

    //Handles dad.MouseUp, dd.MouseUp
    private void Form1_MouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
    {
        try {
            bCaptureMe = false;
        } catch {
        }
    }

    public ClsCapture(Control pnl)
    {
        dd = pnl;
        dd.PreviewMouseLeftButtonDown += Form1_MouseDown;
        dd.PreviewMouseLeftButtonUp += Form1_MouseUp;
        dd.PreviewMouseMove += Form1_MouseMove;
    }

    public static void CaptureMe(Control pnl)
    {
        ClsCapture cc = new ClsCapture(pnl);
    }

}

用法:

ClsCapture.CaptureMe(AnyControlYouWant);