可移动自定义控件

本文关键字:自定义控件 可移动 | 更新日期: 2023-09-27 18:17:31

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

    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,并保留在主要形式中移动的控件列表,但这一切都很麻烦……正确的解决方案是什么?

注::控件是动态生成的,所以我需要c#代码的解决方案,而不是在XML。

可移动自定义控件

尝试使用CaptureMouse方法

看看这样的东西是否适合你:

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);
        }
    }