В форме C# у меня есть панель, привязал все стороны, и внутри, текстовое поле, привязанное главный/левый/правильный.
Когда текст загружается в текстовое поле, я хочу это к автоматическому, разворачивают себя вертикально так, чтобы я не должен был прокручивать текстовое поле (прокрутите панель самое большее, если существует больше текста, который не соответствует панели). там какой-либо путь состоит в том, чтобы сделать это с текстовым полем? (я не вынужден использовать это управление поэтому, если существует другое управление, которое соответствует описанию, не стесняйтесь упоминать это),
Я предполагаю, что это многострочное текстовое поле, и вы позволите ему увеличиваться по вертикали. Этот код работал хорошо:
private void textBox1_TextChanged(object sender, EventArgs e) {
Size sz = new Size(textBox1.ClientSize.Width, int.MaxValue);
TextFormatFlags flags = TextFormatFlags.WordBreak;
int padding = 3;
int borders = textBox1.Height - textBox1.ClientSize.Height;
sz = TextRenderer.MeasureText(textBox1.Text, textBox1.Font, sz, flags);
int h = sz.Height + borders + padding;
if (textBox1.Top + h > this.ClientSize.Height - 10) {
h = this.ClientSize.Height - 10 - textBox1.Top;
}
textBox1.Height = h;
}
Вы должны сделать что-нибудь разумное, когда текстовое поле пусто, например, установить свойство MinimumSize.
Я бы предложил использовать Graphics.MeasureString
.
Сначала вы создаете объект Graphics
, затем вызываете для него MeasureString
, передавая строку и шрифт текстового поля.
Пример
string text = "TestingTesting\nTestingTesting\nTestingTesting\nTestingTesting\n";
// Create the graphics object.
using (Graphics g = textBox.CreateGraphics()) {
// Set the control's size to the string's size.
textBox.Size = g.MeasureString(text, textBox.Font).ToSize();
textBox.Text = text;
}
Вы также можете ограничить его вертикальной осью, установив только свойство textBox.Size.Height
и используя перегрузку MeasureString
, которая также принимает int ширина
.
Edit
Как указал SLaks, другой вариант - использовать TextRenderer.MeasureString
. Таким образом, нет необходимости создавать объект Graphics
.
textBox.Size = TextRenderer.MeasureString(text, textBox.Font).ToSize();
Здесь вы можете ограничиться изменением размера по вертикали с помощью техники Ханса, передав дополнительный параметр Size
в MeasureString
с высотой int.MaxValue
.
Можно использовать Label и установить AutoSize на true
.
Вы можете привязать его к нижней части, что обеспечит изменение размера текстового поля по вертикали при изменении размера формы, к которой оно принадлежит. Кроме того, текстовое поле, изменяющее свой размер, может быть не очень элегантным, поскольку оно может нарушить способ отображения других компонентов. Почему бы вам не задать ему максимальный размер вместо того, чтобы изменять его размер?
.