2010-10-19 25 views
14

En el proceso de traducción de una aplicación con C# + Winforms, necesito cambiar el texto de un botón según el idioma.Cómo cambiar el tamaño de un botón según su texto

Mi problema es el siguiente: "Hola a todos"

Digamos que quiero traducir un botón desde a "Bonjour tout le monde"!

Como puede adivinar, el tamaño del botón no será el mismo si ingreso texto en inglés o en francés ... Mi pregunta es "simple", ¿cómo puedo lograr cambiar el tamaño del botón sobre la marcha para que el texto se ajusta a su contenido en el botón?

¡Hasta ahora tengo algo así!

[Hola a todos!]

[Bonjour]

Respuesta

19

Su mejor opción es establecer la propiedad AutoSize como se describe ach's answer

Sin embargo, si AutoSize no está funcionando para ti, el cambio de tamaño en el botón el código es bastante fácil. Solo puede necesitar configurar el ancho del botón. El truco es hacerlo lo suficientemente grande como para adaptarse a su texto.

using(Graphics cg = this.CreateGraphics()) 
    { 
     SizeF size = cg.MeasureString("Please excuse my dear aunt sally",this.button1.Font); 

     // size.Width+= 3; //add some padding .net v1.1 and 1.0 only 
     this.button1.Padding = 3; 
     this.button1.Width = (int)size.Width; 

     this.button1.Text = "Please excuse my dear aunt sally"; 
    } 
+0

¡Muchas gracias! –

+0

¿No deberías agregar el relleno? 'this.button1.Width = (int) size.Width + button1.Padding.Left + button1.Padding.Right;'. Y si tiene una imagen a la derecha o a la izquierda del texto, entonces debería agregar el ancho de la imagen. –

+0

@ OlivierJacot-Descombes Basado en el [historial de revisiones] (http://stackoverflow.com/posts/3965742/revisions) pensé que también y luego cambié mi respuesta. Como hay una respuesta superior (la de Andrew) y sería fácil para cualquiera que use esta respuesta determinar si necesita contabilizar el relleno en el tamaño o no, declinaré modificar esta respuesta. –

24

No hay absolutamente ninguna necesidad de utilizar el Graphics objeto subyacente de que los otros críticos han dicho.

Si establece la propiedad del botón de AutoSize true, el AutoSizeMode a GrowAndShrink y el AutoEllipsis en false, se cambiará automáticamente el tamaño para ajustarse al texto.

Dicho esto, es posible que tenga que hacer varios ajustes de diseño para que este cambio se ajuste a su UI. Puede ajustar el relleno del botón para agregar espacio alrededor del texto, y es posible que desee colocar los botones en un TableLayoutPanel (o algo así) para evitar que se superpongan al cambiar el tamaño.

Editar: @mastro señaló que: AutoEllipsis sólo es válida cuando es AutoSizefalse (Como se explica en the documentation), por lo que puede ser ignorado con seguridad, siempre y cuando las otras tres propiedades se establecen correctamente.

+0

Para la necesidad del OP, esta puede ser una solución mucho mejor porque parece que se trata de un tema bastante sencillo. Sin embargo, la declaración "absolutamente ninguna necesidad" es engañosa. MeasureString es una de las mejores herramientas que un programador crea formularios y controles personalizados tiene disponible. También es útil para los programadores web (a través de un manejador HTTP) para crear imágenes de tamaño preciso basadas en texto variable. –

+2

@Tim - No estoy diciendo nada negativo sobre MeasureString, tiene sus usos, pero este es inequívocamente ninguno de ellos. Acertijo de su código con código innecesario y arbitrario (ancho + = 3) es una mala práctica. –

8

Prueba esto:

Button.AutoSize = true; 
Button.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowOnly; 
Button.TextAlign = ContentAlignment.MiddleLeft; 
Button.Padding = new Padding(0, 0, 0, 0); 
1

Como Andrew Hanlon explica, se puede establecer AutoSize = true.

Al hacerlo, también puede obtener un diseño perfecto de los botones de forma automática colocándolos en un FlowLayoutPanel.

La distancia horizontal entre ellas siempre será la misma cuando el FlowDirection del FlowLayoutPanel es LeftToRight o RightToLeft. Puede ajustar esta distancia configurando la propiedad Margin de los botones de forma adecuada. Puede crear grupos de botones aumentando el margen izquierdo de los botones que comienzan un nuevo grupo.

Si se establece la propiedad Dock de los botones para DockStyle.Fill, incluso crecerán su anchura de forma automática con el fin de adaptarse al botón más amplia si el FlowDirection del FlowLayoutPanel es TopDown o BottomUp.

btn.AutoSizeMode = AutoSizeMode.GrowOnly; 
btn.AutoSize = true; 
btn.Dock = DockStyle.Fill; 
1

Para activar un botón en WinForms crecer y/o reducir en función del tamaño del texto, es necesario establecer la propiedad del botón AutoSize-True y la propiedad AutoSizeMode a GrowAndShrink.

// C# 
btn.AutoSize = true; 
btn.AutoSizeMode = AutoSizeMode.GrowAndShrink; 

' VB.NET 
btn.AutoSize = True 
btn.AutoSizeMode = AutoSizeMode.GrowAndShrink 

Tenga en cuenta que la propiedad AutoSize sólo permitirá el tamaño del botón para crecer si la propiedad se establece en AutoSizeModeGrowOnly; cambiando la propiedad AutoSizeMode a GrowAndShrink, el botón ahora se ampliará o reducirá automáticamente en ancho y alto en función de su propiedad Text.

También tenga en cuenta que al establecer las dos propiedades como se muestra arriba, puede hacer uso de nuevas líneas (Environment.NewLine o vbCrLf) en la propiedad Texto y el botón se reducirá según sea necesario.

Cuestiones relacionadas