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