Respuestas:
La respuesta rápida: apague AutoSize .
El gran problema aquí es que la etiqueta no cambiará su altura automáticamente (solo ancho). Para hacerlo correctamente, deberá subclasificar la etiqueta e incluir la lógica de cambio de tamaño vertical.
Básicamente, lo que debe hacer en OnPaint es:
También deberá establecer el indicador de estilo ResizeRedraw en el constructor.
En realidad, la respuesta aceptada es innecesariamente complicada.
Si configura la etiqueta en AutoSize, crecerá automáticamente con el texto que ponga. (Esto incluye crecimiento vertical).
Si desea que se ajuste la palabra en un ancho particular, puede establecer la propiedad MaximumSize.
myLabel.MaximumSize = new Size(100, 0);
myLabel.AutoSize = true;
Probado y funciona.
Dock
propiedad de la etiqueta y el panel en Top
lugar de mi solución.
OnResize
la matriz y la llamadamyLabel.MaximumSize = new Size(Bounds.Width, 0);
En mi caso (etiqueta en un panel) configuré label.AutoSize = false
y label.Dock = Fill
. Y el texto de la etiqueta se ajusta automáticamente.
No existe una propiedad de ajuste automático, pero esto se puede hacer mediante programación para dimensionarlo dinámicamente. Aquí hay una solución:
Seleccione las propiedades de la etiqueta.
AutoSize
= True
MaximumSize
= ( Ancho , Altura ) donde Ancho = tamaño máximo que desea que sea la etiqueta y Altura = cuántos píxeles desea que se ajuste
Desde MSDN , Ajustar automáticamente el texto en la etiqueta :
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;
)
Tenía que encontrar una solución rápida, así que solo usé un TextBox con esas propiedades:
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
};
Tener uno mejor basado en la respuesta 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;
esto le permite usar la etiqueta de crecimiento automático cuando está acoplada a un padre, por ejemplo, un panel.
this.Height = sz.Height + Padding.Bottom + Padding.Top;
aquí nos encargamos del relleno para arriba y abajo.
Maneje el ClientSizeChanged event
para el panel, haciendo que la etiqueta llene el espacio:
private void Panel2_ClientSizeChanged(object sender, EventArgs e)
{
label1.MaximumSize = new Size((sender as Control).ClientSize.Width - label1.Left, 10000);
}
Establecer Auto-Size
para la etiqueta atrue
Dock
para la etiqueta aFill
No estoy seguro de que encajará todos los casos de uso, pero a menudo utilizar un simple truco para obtener el comportamiento de embalaje: poner su Label
con AutoSize=false
el interior de un 1x1 TableLayoutPanel
que se encargará del Label
tamaño 's.
Si su panel está limitando el ancho de su etiqueta, puede establecer la propiedad Anchor de su etiqueta en Left, Right y establecer AutoSize en true. Esto es conceptualmente similar a escuchar el SizeChanged
evento del Panel y actualizar el Tamaño máximo de la etiqueta a new Size(((Control)sender).Size.Width, 0)
lo sugerido por una respuesta anterior . Todos los lados enumerados en la propiedad Anchor están, bueno, anclados al lado interno respectivo del Control que lo contiene. Entonces, enumerar dos lados opuestos en Anchor establece efectivamente la dimensión del control. Anclar a izquierda y derecha establece la propiedad Ancho del control y Anclar a superior e inferior establecería su propiedad Altura.
Esta solución, como C #:
label.Anchor = AnchorStyles.Left | AnchorStyles.Right;
label.AutoSize = true;
Si realmente desea establecer el ancho de la etiqueta independientemente del contenido, creo que la forma más fácil es esta:
Ahora la etiqueta tiene un ancho constante, pero adapta su altura automáticamente.
Luego, para el texto dinámico, disminuya el tamaño de la fuente. Si es necesario, use este fragmento en el subtítulo donde se establece el texto de la etiqueta:
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
Esto me ayudó en mi formulario llamado 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 respuesta simple para este problema es cambiar la propiedad DOCK de la etiqueta. Es "NINGUNO" por defecto.
Si está ingresando texto en la etiqueta de antemano, puede hacerlo.
Úselo style="overflow:Scroll"
en la etiqueta como en el siguiente HTML. Esto agregará la barra de desplazamiento en la etiqueta dentro del panel.
<asp:Label
ID="txtAOI"
runat="server"
style="overflow:Scroll"
CssClass="areatext"
BackColor="White"
BorderColor="Gray"
BorderWidth="1"
Width = "900" ></asp:Label>