2009-11-07 24 views
39

La forma más obvia de alinear correctamente un Label en WinForms no funciona: establecer ancla en Arriba/Abajo a la derecha y TextAlign en TopRight. Si el texto cambia, la coordenada izquierda de la etiqueta permanece inalterada en lugar de la coordenada Derecha (que, podría decirse, es un error).Etiquetas alineadas a la derecha en WinForms

Por este motivo, siempre utilicé un ancho completo TableLayoutPanel para las etiquetas alineadas a la derecha. Sin embargo, esto no siempre es muy conveniente, dependiendo del diseño en cuestión ...

Entonces, me pregunto si hay otras formas de mantener una etiqueta alineada a la derecha en WinForms que nunca se me ocurrió.

Respuesta

46

Una opción simple es deshabilitar AutoSize (establecer en false) y sobredimensionarlo para que quede espacio libre.

Alternativamente, quizás use Dock en lugar de solo Anchor, aunque esto tiene un significado diferente, por lo que puede necesitar ponerlo en un Panel o similar). En última instancia, esto funciona como el primero, al sobredimensionarlo en primer lugar; entonces tal vez la primera opción es más simple.

+0

Ah, sí, éstos también se pueden utilizar dependiendo de las circunstancias. Siempre me preocupa un poco que en otros sistemas el texto no se ajuste verticalmente, ya que el primer método desactiva el autosizing vertical. ¿Algún comentario sobre si esto alguna vez es un problema? –

+0

Sin grandes pensamientos; por supuesto, WPF puede tener más flexibilidad ;-p –

+1

+1, la desactivación de AutoSize funciona para mí. – rockXrock

0

si establece la propiedad del formulario RightToLeft = yes; , por lo que no debe usar la propiedad Alinear texto, simplemente configure Ancla. probar este se acerca:

Form.righttoleft = yes; 
label.anchor = Top, Right; 
label.TextAlign = TopLeft; 

o

Form.righttoleft = No; 
label.anchor = Top, Right; 
label.TextAlign = TopRight; 

o

Form.righttoleft = yes; 
label.righttoleft = No; 
label.anchor = Top, Right; 
label.TextAlign = TopRight; 
+0

¿No se pudo hacer que esto funcione? – Coops

9

El uso de un TableLayoutPanel con etiquetas atracados es el único método fiable que he encontrado para la colocación de etiquetas alineados a la derecha en Winforms. Desactivar AutoSize y usar etiquetas de gran tamaño parece causar anomalías extrañas para los usuarios de High DPI.

+0

Probé TableLaoutPanel, es una pena alinear correctamente una etiqueta, pero si funciona, entonces es genial. Sin embargo, el texto siguió envuelto en la siguiente línea para mí algún consejo? – Coops

8

Usar un FlowLayoutPanel para hacerlo funciona muy bien.

flowLayoutPanel.FlowDirection = System.Windows.Forms.FlowDirection.RightToLeft; 
flowLayoutPanel2.Controls.Add(label); 

Luego, solo asegúrese de que flowLayoutPanel sea lo suficientemente grande para que la etiqueta se expanda.

+0

+1 por mencionar RightToLeft; – rockXrock

7

Esto es lo que funcionó para mí en un formulario estándar

  • Conjunto AutoSize propiedad fuera por tan sólo las etiquetas que deberán alineados a la derecha
  • hacer todos los campos del mismo tamaño (tal vez esto no es realmente necesario) utilizando la barra de herramientas diseño
  • multi-seleccionar las etiquetas y alinear a la derecha usando la barra de herramientas diseño, posición en la que desea
  • propiedad
  • Conjunto TextAlign a uno de los ajustes xxxRight, por ejemplo, topright
0

La mejor solución para mí fue:

  1. Establecer las etiquetas de propiedad AutoSize a falso. Establezca las etiquetas de propiedad TextAlign
  2. a algo a la derecha.
  3. Redimensione manualmente las etiquetas 1 por 1 para que puedan usar más espacio.
0

asociar un controlador de un evento a otro SizeChanged de las etiquetas:

private void label1_SizeChanged(object sender, EventArgs e) 
{ 
    label1.Location = new Point(Your_Anchor_Point - label1.Width, label1.Location.Y); 
} 

Para ser más DPI amigable considere el uso de algún otro control que el punto de anclaje, es decir

label1.Location = new Point(dataGridView1.Location.X + dataGridView1.Width - label1.Width, label1.Location.Y); 

para alinear a el lado derecho del dgv.

(BTW: He probado la pintura & TextChanged eventos pero parecía estar confundido a veces - probablemente algo que ver con el orden de eventos en particular en la apertura de una nueva forma.)

1

bien como Sphax dado cuenta de que tiene que:

  1. Conjunto AutoSize en false
  2. Establecer TextAlign a la derecha, por ejemplo, para MiddleRight
  3. Cambiar el tamaño de la etiqueta a tamaño real usando Código MeasureString

:

label.AutoSize = false; 
label.TextAlign = ContentAlignment.MiddleRight;  

int yourWidthHere = 100;  
using (Graphics g = label.CreateGraphics())  
{  
    SizeF size = g.MeasureString(text, label.Font, yourWidthHere);  
    label.Height = (int)Math.Ceiling(size.Height);  
    label.Text = text;  
} 
0
  • creado de forma dinámica de etiqueta de tamaño automático predeterminado es falso.
  • si el autoestado de la etiqueta es falso. contiene espacio extra en blanco
  • que te hace pensar que no se alinea correctamente. diagnosticarla, conjunto de la etiqueta backColour a lightgreen

enter image description here

int rowIndex=1; 

var lbx = new Label(); 
lbx.AutoSize = true;   // default is false. 
lbx.BackColor = Color.Green; // to see if it's aligning or not 
lbx.Text = "Iam Autosize=true"; 
lbx.Anchor = AnchorStyles.Right; 
tlPanel.Controls.Add(lbx, 0, rowIndex); 

var dtp = new DateTimePicker(); 
dtp.Anchor = AnchorStyles.Left; 
tlPanel.Controls.Add(dtp, 1, rowIndex); 


    //--- row 2 autosize false 
rowIndex=2; 
    var lbx2 = new Label(); 
lbx2.AutoSize = false;   // default is false. 
lbx2.BackColor = Color.Green; // to see if it's aligning or not 
lbx2.Text = "AutoSz=false"; 
lbx2.Anchor = AnchorStyles.Right; 
tlPanel.Controls.Add(lbx2, 0, rowIndex); 

var dtp = new DateTimePicker(); 
dtp.Anchor = AnchorStyles.Left; 
tlPanel.Controls.Add(dtp, 1, rowIndex); 
Cuestiones relacionadas