【问题标题】:Preventing moving of a control out of its container防止将控件移出其容器
【发布时间】:2017-05-03 21:16:14
【问题描述】:

这个问题与我的另一个问题有关,可以在这里找到can be found here。我想在它的父容器中移动一个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 + (e.X - start.X),  
                             pictureBoxPackageView.Top + (e.Y - start.Y)); 
  } 
} 

void pictureBoxPackageView_MouseDown(object sender, MouseEventArgs e) { 
  start = e.Location; 
  _mapPackageIsMoving = true; 
} 

现在我的问题是,这种控制移动没有限制。用户可以将控件从TabPage 的可见区域拖出几公里,我的图片框位于其中。我试图通过像这样更改MouseMove 事件来添加一些移动限制,以至少防止它超出标签页的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 + (e.X - start.X),  
                             pictureBoxPackageView.Top + (e.Y - start.Y)); 
  } 
} 

但是上面代码的问题是,每当图片框碰到容器的右侧或左侧并且LeftRight等于0时,我就不能再移动控件了。

任何帮助/提示可以限制图片框Left, Right, Top and Bottom 在容器内的移动!

【问题讨论】:

    标签: c# winforms controls mouseevent mousemove


    【解决方案1】:

    您可以无条件移动框(不测试当前位置)并对您的新位置有限制:

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

    【讨论】:

    • 谢谢!这就像一个魅力。你介意再告诉我一件事吗?如何让控件通过容器的Bottom?我的意思是限制不应该适用于底部,但仍适用于左侧、右侧和顶部。
    • 没关系,找到var y = Math.Min(Math.Max(finalLocation.Y, 0), pictureBoxPackageView.Bottom);
    • 这里有错别字。pictureBoxPackageView.parent应该是pictureBoxPackageView.Parent
    【解决方案2】:

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

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

    【讨论】:

    • 为什么要重复一个非常古老的话题的答案?这里有一些要点?!
    • 我认为我们有点过于敏感了。我对积分一无所知,也不知道乐于助人是一种游戏。这是我不知道的某种游戏吗?我只是想提供帮助。但这可以解释为什么每个人似乎都如此渴望不提供帮助。大声笑我会问一个问题并得到负分。这是一个游戏网站吗??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 2018-11-22
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多