Как горизонтально центрировать несколько объектов внутри данного контейнера? - PullRequest
1 голос
/ 09 апреля 2011

Я потратил весь день, пытаясь решить эту проблему без каких-либо удовлетворительных результатов.

Я должен центрировать некоторые этикетки внутри их контейнера (панели).Если бы была только одна метка, это было бы просто, но жизнь не из легких, и мне пришлось бы написать метод для центрирования нескольких объектов и преодоления двух проблем:

  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 работать, если я не знаю тип объекта (просточто он имеет те же свойства).У меня есть ощущение, что мне это понадобится в ближайшем будущем, и я понятия не имею, как это сделать.

1 Ответ

1 голос
/ 09 апреля 2011

По крайней мере, для вашего второго вопроса, просто измените Label lbl на Control ctrl.Это может взять произвольный контроль и сосредоточить его на его родителе, предполагая, что это был один.Вы можете проверить это условие.

Обновление:

Я подумал о вашей проблеме немного больше.Во-первых, ваше приложение будет аварийно завершать работу во время цикла foreach, если на панели есть какие-либо элементы управления, отличные от Label.Измените его на foreach (Control ctrl in panel1.Controls).Здесь также используется мой первоначальный ответ на ваш второй вопрос.

Ваша основная проблема заключается в том, что, учитывая некоторое количество элементов управления, они должны быть горизонтально отцентрированы на своих родительских элементах и ​​равномерно разнесены.Общая ширина этого: (control1.Width + offset) + (control2.Width + offset) ... (controlN.Width + offset) - offset.Координата x (startX) этого, если (Parent.Width / 2) - (TotalWidth / 2).Теперь, когда вы знаете координату 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;
    }
}

Я, по общему признанию, не проверял это, но, может быть, вы получите это работает отсюда.Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...