0

我刚刚完成了处理表格布局面板中的 UI 的程序的一部分。到目前为止,这已经奏效,但我注意到,在我可以在运行时围绕表单尝试我的控件(我添加的功能)之前,但现在它在单元格中,它们不能移动到其容器单元格之外。但是,这很好,正是我所需要的,但我发现控件(例如按钮)将正确包含在左侧的单元格和单元格的顶部边界中,但底部和右侧边界允许控制消失。下面是一些截图来演示:

在此处输入图像描述

在这里,我们看到按钮控件不能越过单元格的顶部和左侧边界。

在此处输入图像描述

然而,在这里它似乎能够越过单元格的底部和右侧边界。

回顾我是如何让我的控件移动的,我遇到了一个我设置了一些变量的部分,如下所示:

public static void MouseMove(object sender, MouseEventArgs e)
         {
             Control control = sender as Control;
             Control container = sender as Control;
             if (control != null)
             {
                 if (Dragging)
                 {
                     if (direction != Direction.Vertical)
                     {
                         container.Left = Math.Max(0, e.X + container.Left - DragStart.X);
                     }
                     if (direction != Direction.Horizontal)
                     {
                         container.Top = Math.Max(0, e.Y + container.Top - DragStart.Y);
                     }
                 }
             }
         }

我想在这里我没有设置底部和右侧容器边界,这是有道理的,但是在探索智能感知时,我似乎无法获得 container.right 和 container.bottom,因为它们带有以下工具提示:

"gets the distance, in pixels, between the right edge of the control, and the left edge of it's container's client area"

和底部一样,只针对控件的底部和容器区域的顶部。

有没有解决的办法?也许某个地方的选项将控件的底部连接到单元格的底部边界,右边也是如此?

编辑1:或者,也许我需要改变我的mousemove事件以更好地处理碰撞,所以如果有人对此也有任何想法,那就太好了,我之前没有真正看过太多碰撞检测,尤其是在winforms中。

4

1 回答 1

1

Control.right 是只读属性。尝试设置

if (direction != Direction.Vertical)
{
    container.Left = Math.Max(0, e.X + container.Left - DragStart.X);
    container.Left = Math.Min(container.Left, container.Parent.Width - container.Width;
}
if (direction != Direction.Horizontal)
{
    container.Top = Math.Max(0, e.Y + container.Top - DragStart.Y);
    container.Top = Math.Min(container.Top, container.Parent.Height - container.Height;
}
于 2012-07-04T11:21:25.307 回答