La manera más obvia para alinear derecha un Label en WinForms no funciona: configuración de anclaje a la parte Superior/parte Inferior Derecha y TextAlign a TopRight. Si los cambios de texto de la etiqueta de la Izquierda coordinar permanece sin cambios, en lugar del Derecho de coordenadas (que, uno podría argumentar, es un error).

Por esta razón siempre he utilizado un ancho completo TableLayoutPanel para alineados a la derecha de las etiquetas. Sin embargo esto no es siempre muy conveniente, dependiendo de la disposición en cuestión…

Así, me pregunto si hay otras maneras de mantener una Etiqueta alineado a la derecha en WinForms que nunca se me ocurrió?

9 Comentarios

  1. 51

    Una simple opción es deshabilitar AutoSize (conjunto a false) y más de ti de tamaño por lo que hay espacio de sobra.

    Alternativamente, tal vez el uso de Dock en lugar de sólo Anchor, aunque esto tiene un significado diferente, por lo que usted puede necesitar para poner en un Panel o similar). En última instancia, esto funciona igual que el primero – sobre-dimensionamiento en el primer lugar; por lo que quizás la primera opción es más simple.

    • Ah, sí, estos también pueden ser utilizados dependiendo de las circunstancias. Siempre estoy un poco preocupado de que en otros sistemas en el texto pueden no ajustarse verticalmente desde el primer método desactiva vertical autosizing. Cualquier comentario respecto a si esto es un problema?
    • Sin grandes pensamientos; por supuesto, WPF puede tener más flexibilidad ;-p
    • +1, Deshabilitar el ajuste Automático de tamaño que funciona para mí.
    • AutoSize…blerg…no escribir las aplicaciones de Windows por un par de años y te olvidas de todos estos matices. Gracias!
  2. 9

    El uso de un TableLayoutPanel con acoplado etiquetas es el único método fiable que he encontrado para colocar alineados a la derecha de las etiquetas en Winforms. Apagado Automático y el uso de etiquetas de gran tamaño parece ser la causa de extrañas anomalías de Alta resolución de PPP usuarios.

    • He probado el TableLaoutPanel, es vergüenza para alinear correctamente una etiqueta, pero si funciona, entonces genial. Sin embargo, el texto mantiene la envoltura en la línea siguiente para mí, ¿algún consejo?
  3. 8

    El uso de un controles flowlayoutpanel a hacer es que funciona muy bien.

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

    Entonces, sólo asegúrese de que los controles flowlayoutpanel es lo suficientemente grande para que la etiqueta se expanda.

    • +1 por mencionar RightToLeft;
  4. 7

    He aquí lo que funcionó para mí en una forma estándar

    • Conjunto de propiedad AutoSize fuera sólo para las Etiquetas que se justifica a la derecha
    • Hacer todos los campos del mismo tamaño (tal vez esto no es realmente necesario) utilizando la barra de herramientas de Diseño
    • Multi-seleccione las etiquetas y a la derecha alinea el uso de la barra de herramientas de Diseño, posición en la que desee
    • Conjunto TextAlign propiedad de uno de los xxxRight configuración de correo.g, TopRight
  5. 1

    Así como Sphax dado cuenta de que tienen a:

    1. Conjunto AutoSize a false
    2. Conjunto TextAlign a Derecho, por ejemplo a MiddleRight
    3. Cambiar el tamaño de la etiqueta a tamaño real utilizando MeasureString

    Código:

    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;    
    }   
  6. 0

    si se establece la forma de propiedad RightToLeft = sí;
    así que usted no debe utilizar el Texto de la propiedad Align acaba de establecer el Ancla.
    pruebe esta enfoques:

    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;
    • No podía conseguir que esto funcione?
  7. 0

    La mejor solución para mí fue:

    1. Establece la propiedad AutoSize etiquetas falsas. Establecer el TextAlign
    2. propiedad etiquetas para algo a la derecha.
    3. Redimensionar manualmente el
      las etiquetas de 1 por 1 para que puedan utilizar más espacio.
  8. 0

    Conectar un controlador de eventos para las etiquetas’ SizeChanged evento:

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

    A ser más DPI amable considerar el uso de algún otro control como el punto de anclaje, es decir,

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

    para alinear a la RH lado de la dgv.

    (Por CIERTO: he probado el Paint & eventos TextChanged pero parecía que a veces se confunde – probablemente algo que ver con el evento, especialmente en la apertura de una nueva forma.)

  9. 0
    • creado dinámicamente la etiqueta predeterminada autosize es falso.
    • si autosize la etiqueta es falsa. contiene un espacio vacío adicional.
    • que trucos que usted piensa que su derecho no se alinean correctamente. para diagnosticarlo,
      establecer la etiqueta de la backColour a lightgreen

    Alineado a la derecha de las etiquetas en WinForms

     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);

Dejar respuesta

Please enter your comment!
Please enter your name here