防止控件移出其容器
这个问题与我的另一个问题有关,可以在这里找到 。 我想在其父容器中移动一个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的Left
和Right
可见区域:
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)); } }
但上面代码的问题是,当图片框击中容器的右侧或左侧并且Left
或Right
等于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);