可移动的自定义控件

时间:2011-12-10 20:02:06

标签: c# wpf controls

我有一个自定义控件,我希望用户能够拖动它。所以我在自定义控件中输入以下代码:

    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。:控件是动态生成的,因此我需要使用C#代码而不是XML格式的解决方案。

1 个答案:

答案 0 :(得分: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);
        }
    }