【问题标题】:How to horizontally center multiple objects inside a given container?如何在给定容器内水平居中多个对象?
【发布时间】:2011-04-09 01:55:57
【问题描述】:

我花了一整天的时间试图解决这个问题,但没有令人满意的结果。

我必须在它们的容器(面板)内居中放置一些标签。如果只有一个标签,那将是一件轻而易举的事,但生活并不容易,我必须编写一种方法来使多个对象居中并克服两个问题:

  1. 可以是 1 到 8 个之间的任意数量的标签,我不知道设计时有多少。
  2. 我必须能够指定标签之间的确切间距。

如果不是2,这不会那么难,经过一番思考,我想出了这个:

private void panel1_Resize(object sender, EventArgs e)
{
    int position = 1;
    foreach (Label l in panel1.Controls)
    {
        CenterToParent(l, panel1.Controls.Count, position);
        position++;
    }
}

private static void CenterToParent(Label lbl, int qty, int pos)
{
    lbl.SetBounds((lbl.Parent.Bounds.Width - lbl.Width) * pos / (qty + 1),
                    lbl.Location.Y, lbl.Width, lbl.Height);
}

但是这样标签之间的空间会随着面板宽度的变化而变化,并且这个间隙必须是固定的大小。这也是为什么我不能简单地使用 TableLayoutPanel。

PS:如果你这么好心,如果我不知道对象类型(只是它确实具有相同的属性),如果你让 CenterToParent 方法工作,那将是非常有启发性的。我有一种感觉,在不久的将来我会需要这个,但我不知道该怎么做。

【问题讨论】:

    标签: c# winforms user-interface


    【解决方案1】:

    至少对于您的第二个问题,只需将Label lbl 更改为Control ctrl。假设它是一个,那可以采取任意控制并将其集中在其父级上。您可能希望检查该情况。

    更新:

    我对你的问题想得更多。首先,如果您的面板上有任何非Label 控件,您的应用程序将在foreach 循环期间崩溃。将其更改为foreach (Control ctrl in panel1.Controls)。这也使用了我对您第二个问题的原始答案。

    您的基本问题是,给定一些控件,它们必须水平居中于其父级并均匀间隔开。它的总宽度是:(control1.Width + offset) + (control2.Width + offset) ... (controlN.Width + offset) - offset。如果(Parent.Width / 2) - (TotalWidth / 2),则 this 的 x 坐标 (startX)。现在您已经知道 x 坐标,您可以开始像这样布置控件了:

    control1.Left = startX;
    control2.Left = control1.Right + offset
    controlN.Left = control(N-1).Right + offset
    

    真正的代码可能是这样的:

    const int Offset = 8; // for example
    int totalWidth = panel1.Controls.Cast<Control>().Aggregate(0, (value, ctrl) => value + ctrl.Width + Offset);
    
    for (int index = 0; index < panel1.Controls.Count; index++)
    {
        Control current = panel1.Controls[index];
    
        if (index == 0)
        {
            current.Left = startX;
        }
    
        else
        {
            current.Left = panel1.Controls[index-1].Right + Offset;
        }
    }
    

    诚然,我没有对此进行测试,但也许你会从这里开始工作。祝你好运。

    【讨论】:

    • 成功了,非常感谢!这些对象有点偏离中心,但只是因为最后一个对象不需要偏移量,我在 totalWidth 中添加了- Offset,现在它很完美。我知道可能发生的崩溃,但我知道该面板内只有标签。对于最后一个请求,我尝试使用Object,但从未想过使用Control。如此明显。 :)
    猜你喜欢
    • 2019-01-15
    • 2015-05-10
    • 1970-01-01
    • 2017-06-29
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    相关资源
    最近更新 更多