una - tag c#
Ajuste de Word para una etiqueta en Windows Forms (17)
- Coloque la etiqueta dentro de un panel
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); }
Establezca
Auto-Size
para la etiqueta comotrue
- Configure el
Dock
para que la etiqueta seFill
¿Cómo podemos obtener la función de ajuste de palabras para una etiqueta en Windows Forms ?
Coloqué una etiqueta en un panel y agregué un poco de texto para etiquetar de forma dinámica. Pero excede la longitud del panel. ¿Como puedo resolver esto?
Desde MSDN , MSDN 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();
}
}
En mi caso (etiqueta en un panel) establecí label.AutoSize = false
y label.Dock = Fill
. Y el texto de la etiqueta se envuelve automáticamente.
En realidad, la respuesta aceptada es innecesariamente complicada.
Si configura la etiqueta como AutoSize, crecerá automáticamente con el texto que ponga en ella. (Esto incluye crecimiento vertical)
Si desea ajustar la palabra en un ancho determinado, puede establecer la propiedad MaximumSize.
myLabel.MaximumSize = new Size(100, 0);
myLabel.AutoSize = true;
Probado y funciona.
Esto me ayudó en mi formulario llamado InpitWindow: en 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 rápida: desactive AutoSize .
El gran problema aquí es que la etiqueta no cambiará automáticamente su altura (solo ancho). Para hacerlo bien, deberá subclasificar la etiqueta e incluir la lógica de cambio de tamaño vertical.
Básicamente, lo que debes hacer en OnPaint es:
- Mida la altura del texto (Graphics.MeasureString).
- Si la altura de la etiqueta no es igual a la altura del texto, establezca la altura y el retorno.
- Dibuja el texto.
También necesitará establecer el ResizeRedraw estilo ResizeRedraw en el constructor.
La respuesta simple para este problema es cambiar la propiedad DOCK de la etiqueta. Es "NINGUNO" por defecto.
Malas noticias: no hay una propiedad de auto envoltura.
Buenas noticias: ¡hay una luz al final del túnel!
Puede lograr esto programáticamente para dimensionarlo de forma dinámica, pero esta es la solución más fácil:
- Seleccione las propiedades de la etiqueta
- AutoSize = True
MaximumSize = ( ancho , alto) donde Ancho = tamaño máximo que desea que tenga la etiqueta y Altura = cuántos píxeles desea que se ajuste
No estoy seguro de que se ajuste a todos los casos de uso, pero a menudo utilizo un truco simple para obtener el comportamiento de ajuste: coloque su Label
con TableLayoutPanel
AutoSize=false
dentro de un TableLayoutPanel
1x1 que se ocupará del tamaño de la Label
.
Para aquellos que encuentran esto: si configura AutoSizeMode en vertical, el ancho es fijo
Si las dimensiones del botón deben mantenerse sin cambios:
myButton.Text = "word/r/nwrapped"
Si realmente desea establecer el ancho de la etiqueta independientemente del contenido, creo que la forma más fácil es la siguiente:
- Establecer autosize verdadero
- Establezca el ancho máximo de la forma en que lo desee
- Establecer el ancho mínimo de forma idéntica
Ahora la etiqueta tiene un ancho constante, pero se adapta automáticamente a su altura.
Luego, para texto dinámico, disminuya el tamaño de la fuente. Si es necesario, use este fragmento en el sub en el que 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
Si su panel está limitando el ancho de su etiqueta, puede configurar la propiedad Anchor de su etiqueta a la Izquierda, Derecha y establecer AutoSize en verdadero. Esto es conceptualmente similar a escuchar el evento SizeChanged
del Panel y actualizar SizeChanged
la etiqueta a un new Size(((Control)sender).Size.Width, 0)
como lo sugirió una respuesta previa . Cada lado enumerado en la propiedad Ancla está, así, anclado al lado interno respectivo del Control. Entonces, enumerar dos lados opuestos en Anchor establece efectivamente la dimensión del control. El anclaje a la izquierda y a la derecha establece la propiedad Ancho del control y el Anclaje a la parte superior e inferior establecería su propiedad Altura.
Esta solución, como C #:
label.Anchor = AnchorStyles.Left | AnchorStyles.Right;
label.AutoSize = true;
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 utilizar la etiqueta de crecimiento automático cuando está acoplado a un elemento principal, por ejemplo, un panel.
this.Height = sz.Height + Padding.Bottom + Padding.Top;
aquí nos ocupamos de relleno para arriba y para abajo.
Use 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>