Risposte:
La risposta rapida: disattiva AutoSize .
Il grande problema qui è che l'etichetta non cambierà automaticamente la sua altezza (solo larghezza). Per farlo bene dovrai sottoclassare l'etichetta e includere la logica di ridimensionamento verticale.
Fondamentalmente quello che devi fare in OnPaint è:
Dovrai anche impostare il flag di stile ResizeRedraw nel costruttore.
In realtà, la risposta accettata è inutilmente complicata.
Se imposti l'etichetta su AutoSize, questa si espanderà automaticamente con qualsiasi testo inserito. (Ciò include la crescita verticale.)
Se si desidera renderlo a capo automatico con una larghezza particolare, è possibile impostare la proprietà MaximumSize.
myLabel.MaximumSize = new Size(100, 0);
myLabel.AutoSize = true;
Testato e funziona.
Dock
proprietà sia dell'etichetta che del pannello Top
, invece della mia soluzione.
OnResize
nel genitore e callmyLabel.MaximumSize = new Size(Bounds.Width, 0);
Nel mio caso (etichetta su un pannello) ho impostato label.AutoSize = false
e label.Dock = Fill
. E il testo dell'etichetta viene spostato automaticamente.
Non esiste una proprietà autowrap ma questo può essere fatto a livello di codice per ridimensionarlo in modo dinamico. Ecco una soluzione:
Seleziona le proprietà dell'etichetta
AutoSize
= True
MaximumSize
= ( Larghezza , Altezza ) dove Larghezza = dimensione massima desiderata per l'etichetta e Altezza = quanti pixel si desidera avvolgere
Da MSDN , avvolgi automaticamente il testo nell'etichetta :
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;
)
Ho dovuto trovare una soluzione rapida, quindi ho appena usato un TextBox con quelle proprietà:
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
};
Avere uno migliore basato sulla risposta di @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;
ciò consente di utilizzare un'etichetta di crescita automatica quando è ancorata a un genitore, ad esempio un pannello.
this.Height = sz.Height + Padding.Bottom + Padding.Top;
qui ci occupiamo dell'imbottitura per la parte superiore e inferiore.
Gestisci ClientSizeChanged event
per il pannello, facendo in modo che l'etichetta riempia lo spazio:
private void Panel2_ClientSizeChanged(object sender, EventArgs e)
{
label1.MaximumSize = new Size((sender as Control).ClientSize.Width - label1.Left, 10000);
}
Impostare Auto-Size
per l'etichetta sutrue
Dock
per l'etichetta suFill
Non sono sicuro che andrà bene tutti i casi d'uso, ma spesso mi utilizzare un semplice trucco per ottenere il comportamento di avvolgimento: mettere il vostro Label
con AutoSize=false
all'interno di un 1x1 TableLayoutPanel
, che si prenderà cura del Label
's dimensioni.
Se il pannello limita la larghezza dell'etichetta, è possibile impostare la proprietà Anchor dell'etichetta su Sinistra, Destra e AutoSize su true. Ciò è concettualmente simile all'ascolto SizeChanged
dell'evento del Pannello e all'aggiornamento del MaximumSize dell'etichetta a new Size(((Control)sender).Size.Width, 0)
come suggerito da una risposta precedente . Ogni lato elencato nella proprietà Anchor è, bene, ancorato al rispettivo lato interno del Controllo contenente. Quindi elencare due lati opposti in Anchor imposta in modo efficace la dimensione del controllo. Ancoraggio a sinistra e a destra imposta la proprietà Larghezza del controllo e Ancoraggio su in alto e in basso imposta la proprietà Altezza.
Questa soluzione, come C #:
label.Anchor = AnchorStyles.Left | AnchorStyles.Right;
label.AutoSize = true;
Se vuoi davvero impostare la larghezza dell'etichetta indipendentemente dal contenuto, trovo che il modo più semplice sia questo:
Ora l'etichetta ha una larghezza costante, ma adatta automaticamente la sua altezza.
Quindi, per il testo dinamico, ridurre la dimensione del carattere. Se necessario, utilizza questo snippet nel sottotitolo in cui è impostato il testo dell'etichetta:
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
Questo mi ha aiutato nel mio modulo chiamato 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);
}
La semplice risposta a questo problema è modificare la proprietà DOCK dell'etichetta. È "NONE" per impostazione predefinita.
Se si inserisce prima del testo nell'etichetta, è possibile farlo.
Utilizzare style="overflow:Scroll"
nell'etichetta come nel codice HTML di seguito. Ciò aggiungerà la barra di scorrimento nell'etichetta all'interno del pannello.
<asp:Label
ID="txtAOI"
runat="server"
style="overflow:Scroll"
CssClass="areatext"
BackColor="White"
BorderColor="Gray"
BorderWidth="1"
Width = "900" ></asp:Label>