Как я нажимаю вниз контроль

У меня есть метка с текстом переменной длины и индикатор выполнения ниже к нему. Я хочу оставить пробел между этой меткой и блоком прогресса, поэтому в зависимости от текста метки (который обернут) прогрессбар должен быть сдвинут вниз, всегда оставляя пробел между ними. Как мне это сделать? Я старался AutoSize = true а также AutoSizeMode = GrowAndShrink но это ничего не изменило. Пример:

 ---------------------------
|  for example the label's  |
|  text might be something  |
|  like this, with a lot of |
|  of text but the progress |
|  bar should be here       |
|                           |
| progressBar here          |
 ---------------------------

пример 2:

 ---------------------------
|  small text               |
|                           |
| progressBar here          |
 ---------------------------

3 ответа

Решение

Поместите Label и ProgressBar в панель FlowLayout, которая имеет FlowDirection свойство установлено в TopDown, Теперь, когда метка растет вертикально, ProgressBar будет автоматически перемещаться вниз. Чтобы контролировать расстояние между Label и ProgressBar, измените Bottom значение в Padding собственность метки.

Вот как выглядит моя форма после нескольких нажатий кнопки AutoSize установлен в true на форме и FlowLayoutPanel (используя GrowOnly в AutoSizeMode):

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        for(int i = 1 ; i < 20; i++)
        {
            label1.Text = label1.Text + " more ";
        }
    }
}

Если вы сохраните исходный Y положение вашего индикатора выполнения, вы можете динамически установить местоположение позже в соответствии с высотой вашего ярлыка. Это сохранит отступы, которые вы установили изначально.

Поэтому, если у меня есть следующая форма, где метка обновляется автоматически при нажатии кнопки, я могу обновить расположение индикатора выполнения в событии нажатия кнопки.

public partial class Form1 : Form
{
    private readonly int initialProgressbarLocationY;

    public Form1()
    {
        InitializeComponent();

        label1.MaximumSize = new Size(80, 1000); //Wrapping label
        label1.AutoSize = true;

        initialProgressbarLocationY = progressBar1.Location.Y; //Save the original position
    }

    private void button1_Click(object sender, EventArgs e)
    {
        label1.Text += "bla blablablabla bla";
        MoveProgressbar();
    }

    private void MoveProgressbar()
    {
        // Set the progressbar at the same X, but update the Y according to the label's height
        progressBar1.Location = new Point(progressBar1.Location.X,
            initialProgressbarLocationY + label1.Height);
    }
}

Что дает следующий результат после нескольких нажатий кнопок:

Если ваша метка начинается с некоторого текста, вам может потребоваться вычесть исходную высоту метки из нового Y, иначе отступы немного увеличатся в первый раз.

Установите ваш label.text. затем

progessBar.Top = label.Bottom + WhateverSpaceYouWant
Другие вопросы по тегам