防止控件移出其容器

这个问题与我的另一个问题有关,可以在这里找到 。 我想在其父容器中移动一个PictureBox ,这是一个TabPage (如果它确实有任何区别!)使用下面的代码可以完成移动:

 private Point start = Point.Empty; private bool _mapPackageIsMoving; void pictureBoxPackageView_MouseUp(object sender, MouseEventArgs e) { _mapPackageIsMoving = false; } void pictureBoxPackageView_MouseMove(object sender, MouseEventArgs e) { if (_mapPackageIsMoving) { pictureBoxPackageView.Location = new Point( pictureBoxPackageView.Left + (eX - start.X), pictureBoxPackageView.Top + (eY - start.Y)); } } void pictureBoxPackageView_MouseDown(object sender, MouseEventArgs e) { start = e.Location; _mapPackageIsMoving = true; } 

现在我的问题是,这种控制的移动没有​​限制。 用户可以将控件拖动距离我的图片框所在的TabPage的可见区域。 我尝试通过像这样更改MouseMove事件来添加一些移动限制,以防止它Left tabpage的LeftRight可见区域:

 void pictureBoxPackageView_MouseMove(object sender, MouseEventArgs e) { if (_mapPackageIsMoving) { //Added condition if (pictureBoxPackageView.Left >= 0 && pictureBoxPackageView.Right >= 0) pictureBoxPackageView.Location = new Point( pictureBoxPackageView.Left + (eX - start.X), pictureBoxPackageView.Top + (eY - start.Y)); } } 

但上面代码的问题是,当图片框击中容器的右侧或左侧并且LeftRight等于0时,我无法再移动控件。

任何帮助/提示,​​以限制图片框的Left, Right, Top and Bottom容器内的这种运动将被appriciated!

您可以无条件地移动盒子(不测试当前位置)并限制您的新位置:

 int nx = Math.Min(Math.Max(pictureBoxPackageView.Left + (eX -start.X),0),pictureBoxPackageView.Parent.Width-pictureBoxPackageView.Width); int ny = Math.Min(Math.Max(pictureBoxPackageView.Top + (eY -start.Y),0),pictureBoxPackageView.Parent.Height-pictureBoxPackageView.Height); pictureBoxPackageView.Location = new Point(nx,ny); 

我想如果你添加以下代码,它将移动项目而不作为一个选项捕捉到顶部。

 //- MouseDownLocation.X //- MouseDownLocation.Y int nx = Math.Min(Math.Max(label1.Left - MouseDownLocation.X + (eX - start.X), 0), label1.Parent.Width - label1.Width); int ny = Math.Min(Math.Max(label1.Top - MouseDownLocation.Y + (eY - start.Y), 0), label1.Parent.Height - label1.Height);