Respostas:
A resposta rápida: desligue o AutoSize .
O grande problema aqui é que o rótulo não altera sua altura automaticamente (somente largura). Para fazer isso direito, você precisará subclassificar o rótulo e incluir lógica de redimensionamento vertical.
Basicamente, o que você precisa fazer no OnPaint é:
Você também precisará definir o sinalizador de estilo ResizeRedraw no construtor.
Na verdade, a resposta aceita é desnecessariamente complicada.
Se você definir o rótulo para AutoSize, ele aumentará automaticamente com o texto que você inserir nele. (Isso inclui crescimento vertical.)
Se você deseja torná-lo com quebra de linha em uma largura específica, pode definir a propriedade MaximumSize.
myLabel.MaximumSize = new Size(100, 0);
myLabel.AutoSize = true;
Testado e funciona.
Dock
propriedade do rótulo e do painel para Top
, em vez da minha solução.
OnResize
no pai e ligueimyLabel.MaximumSize = new Size(Bounds.Width, 0);
No meu caso (etiqueta em um painel), defino label.AutoSize = false
e label.Dock = Fill
. E o texto do rótulo é quebrado automaticamente.
Não há propriedade de quebra automática, mas isso pode ser feito programaticamente para dimensioná-lo dinamicamente. Aqui está uma solução:
Selecione as propriedades do rótulo
AutoSize
= True
MaximumSize
= ( Largura , Altura ), em que Largura = tamanho máximo que você deseja que o rótulo seja e Altura = quantos pixels você deseja que ele envolva
No MSDN , agrupar automaticamente o texto no rótulo :
using System;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
public class GrowLabel : Label {
private bool mGrowing;
public GrowLabel() {
this.AutoSize = false;
}
private void resizeLabel() {
if (mGrowing)
return;
try {
mGrowing = true;
Size sz = new Size(this.Width, Int32.MaxValue);
sz = TextRenderer.MeasureText(this.Text, this.Font, sz, TextFormatFlags.WordBreak);
this.Height = sz.Height;
}
finally {
mGrowing = false;
}
}
protected override void OnTextChanged(EventArgs e) {
base.OnTextChanged(e);
resizeLabel();
}
protected override void OnFontChanged(EventArgs e) {
base.OnFontChanged(e);
resizeLabel();
}
protected override void OnSizeChanged(EventArgs e) {
base.OnSizeChanged(e);
resizeLabel();
}
}
Height = sz.Height + Padding.Vertical;
)
Eu tive que encontrar uma solução rápida, então apenas usei um TextBox com essas propriedades:
var myLabel = new TextBox
{
Text = "xxx xxx xxx",
WordWrap = true,
AutoSize = false,
Enabled = false,
Size = new Size(60, 30),
BorderStyle = BorderStyle.None,
Multiline = true,
BackColor = container.BackColor
};
Tenha um melhor com base na resposta de @hypo
public class GrowLabel : Label {
private bool mGrowing;
public GrowLabel() {
this.AutoSize = false;
}
private void resizeLabel() {
if (mGrowing)
return;
try {
mGrowing = true;
int width = this.Parent == null ? this.Width : this.Parent.Width;
Size sz = new Size(this.Width, Int32.MaxValue);
sz = TextRenderer.MeasureText(this.Text, this.Font, sz, TextFormatFlags.WordBreak);
this.Height = sz.Height + Padding.Bottom + Padding.Top;
} finally {
mGrowing = false;
}
}
protected override void OnTextChanged(EventArgs e) {
base.OnTextChanged(e);
resizeLabel();
}
protected override void OnFontChanged(EventArgs e) {
base.OnFontChanged(e);
resizeLabel();
}
protected override void OnSizeChanged(EventArgs e) {
base.OnSizeChanged(e);
resizeLabel();
}
}
int width = this.Parent == null ? this.Width : this.Parent.Width;
isso permite que você use a etiqueta de crescimento automático quando acoplada a um pai, por exemplo, um painel.
this.Height = sz.Height + Padding.Bottom + Padding.Top;
aqui cuidamos do preenchimento da parte superior e inferior.
Manuseie o ClientSizeChanged event
para o painel, fazendo com que a etiqueta preencha o espaço:
private void Panel2_ClientSizeChanged(object sender, EventArgs e)
{
label1.MaximumSize = new Size((sender as Control).ClientSize.Width - label1.Left, 10000);
}
Defina Auto-Size
para o rótulo comotrue
Dock
para o rótulo comoFill
Não tenho certeza que vai caber todos os casos de uso, mas muitas vezes eu uso um truque simples para obter o comportamento de acondicionamento: colocar o seu Label
com AutoSize=false
dentro de um 1x1 TableLayoutPanel
que vai cuidar do Label
's tamanho.
Se o seu painel estiver limitando a largura do seu rótulo, você poderá definir a propriedade Âncora do rótulo como Esquerda, Direita e definir AutoSize como true. É conceitualmente semelhante a ouvir o SizeChanged
evento do Painel e atualizar o MaximumSize do rótulo para um new Size(((Control)sender).Size.Width, 0)
como sugerido por uma resposta anterior . Todos os lados listados na propriedade Anchor estão bem ancorados no respectivo lado interno do controle. Portanto, listar dois lados opostos no Anchor efetivamente define a dimensão do controle. Ancoragem para esquerda e direita define a propriedade Largura do controle e Ancoragem para superior e inferior deve definir sua propriedade Altura.
Esta solução, como C #:
label.Anchor = AnchorStyles.Left | AnchorStyles.Right;
label.AutoSize = true;
Se você realmente deseja definir a largura do rótulo independente do conteúdo, acho que a maneira mais fácil é a seguinte:
Agora, o rótulo tem largura constante, mas adapta sua altura automaticamente.
Em seguida, para texto dinâmico, diminua o tamanho da fonte. Se necessário, use este snippet na sub onde o texto do rótulo está definido:
If Me.Size.Height - (Label12.Location.Y + Label12.Height) < 20 Then
Dim naam As String = Label12.Font.Name
Dim size As Single = Label12.Font.SizeInPoints - 1
Label12.Font = New Font(naam, size)
End If
Isso me ajudou em meu formulário chamado InpitWindow: In Designer for Label:
AutoSize = true;
Achors = Top, Left, Right.
private void InputWindow_Shown(object sender, EventArgs e) {
lbCaption.MaximumSize = new Size(this.ClientSize.Width - btOK.Width - btOK.Margin.Left - btOK.Margin.Right -
lbCaption.Margin.Right - lbCaption.Margin.Left,
Screen.GetWorkingArea(this).Height / 2);
this.Height = this.Height + (lbCaption.Height - btOK.Height - btCancel.Height);
//Uncomment this line to prevent form height chage to values lower than initial height
//this.MinimumSize = new Size(this.MinimumSize.Width, this.Height);
}
//Use this handler if you want your label change it size according to form clientsize.
private void InputWindow_ClientSizeChanged(object sender, EventArgs e) {
lbCaption.MaximumSize = new Size(this.ClientSize.Width - btOK.Width - btOK.Margin.Left * 2 - btOK.Margin.Right * 2 -
lbCaption.Margin.Right * 2 - lbCaption.Margin.Left * 2,
Screen.GetWorkingArea(this).Height / 2);
}
A resposta simples para esse problema é alterar a propriedade DOCK do Label. É "NENHUM" por padrão.
Se você estiver inserindo texto no rótulo com antecedência, poderá fazer isso.
Use style="overflow:Scroll"
no rótulo como no HTML abaixo. Isso adicionará a barra de rolagem no rótulo dentro do painel.
<asp:Label
ID="txtAOI"
runat="server"
style="overflow:Scroll"
CssClass="areatext"
BackColor="White"
BorderColor="Gray"
BorderWidth="1"
Width = "900" ></asp:Label>