将控制器相对于彼此定位在不同的容器中

时间:2013-07-12 08:27:21

标签: c# winforms relativelayout

我有以下情况,我想将Button1放在正下方并水平对齐Button 2,但仍然Button1位于groupBox1,而Button 2位于groupBox2

enter image description here

我看过几篇关于PointToClient()PointToScreen()的帖子,但在这种情况下仍然无法在不同容器之间正确翻译 - groupBox1groupBox2

我已经尝试了下面代码的一些变体(例如,每当调整窗体大小时尝试重新定位按钮),但我仍然对这究竟是如何工作感到困惑。

具体来说,我似乎不清楚control我应该打PointToScreen()哪个,以及我应该将哪些参数传递给该方法以实现我上面所描述的内容。

private void Form1_Paint(object sender, PaintEventArgs e)
{  
    var btn2Pos = button2.PointToScreen(button2.Location);

    button1.Location = button1.PointToClient(btn2Pos);
}

解决这个问题的最简单方法是什么?

  

旁注,这样做的原因
  我希望能够禁用groupBox2及其中的所有控件,但仍然保持确定   启用了button 1之类的控件,即使它们已定位   相对于button 2

3 个答案:

答案 0 :(得分:1)

我认为您不需要在此使用PointToClientPointToScreen

//This will place button1 over button2
button1.Left = groupBox2.Left + button2.Left;
button1.Top = groupBox2.Top + button2.Top;

如果您想使用PointToClientPointToScreen,可以执行以下操作:

//The code should be placed in Form load, if placing in form Constructor, the result may be not expected.
private void Form1_Load(object sender, EventArgs e){ 
  //This will place button1 over button2
  button1.Location = groupBox1.PointToClient(groupBox2.PointToScreen(button2.Location));
}

答案 1 :(得分:0)

您可以通过考虑不同的相对位置来依赖.Left / .Top属性。例如:

button1.Location = positining(button1);

通过在这些行上调用函数:

private Point positining(Button curButton)
{
    Point outPoint = new Point();

    if(curButton == button1)
    {
        outPoint.X = groupBox2.Left + button2.Right + 20;
        outPoint.Y = groupBox2.Top + button2.Bottom - 20;
    }
    else if (curButton == button2)
    {
        outPoint.X = groupBox2.Left + button1.Left - 20 - button2.Width;
        outPoint.Y = groupBox2.Top + button1.Top + 20 + button2.Height;
    }

    return outPoint;
}

答案 2 :(得分:0)

我很欣赏这里的答案,但最后根据同事的提议最终使用了以下解决方案:

我创建了另一个第三个容器,但这个容器没有边框。该容器与groupBox2完全重叠,button1位于该容器内,因此相对于它。

由于新容器的点(0,0)与groupBox2中的等效点重叠,因此任何容器中具有相同坐标的任何控件都将位于同一位置,而我需要的只是如果需要,请确保调用BringToFront()(和/或SendToBack())以确保正确显示控件。