tipo tamaño predeterminada letra fuente como cambiar c# .net winforms

c# - tamaño - Problemas con AutoScaleMode con la fuente predeterminada modificada



como cambiar el tipo de letra en c# (8)

Finalmente encontré una respuesta para mi pregunta. En resumen, el efecto no surge cuando se establece la fuente de cada control individualmente en lugar de establecer la fuente del formulario que lo contiene. De esta manera, la función de escalado automático funciona como debería. Curiosamente, la configuración de la fuente de los controles cambia el comportamiento de escalado automático, incluso si la propiedad AutoScaleMode está establecida en AutoScaleMode.Dpi , no solo cuando se establece en AutoScaleMode.Font .

Como solución pragmática, creamos un pequeño programa de línea de comandos, que lee los archivos designer.cs, escanea si todos los controles tienen una asignación explícita de fuentes, y si no, agrega la asignación a una copia recién creada del código del diseñador. Incorporamos este programa en nuestro conjunto de pruebas automáticas, de modo que cada vez que un formulario obtiene controles nuevos, o se agrega un nuevo formulario, y el desarrollador olvida agregar la asignación explícita de fuentes, las pruebas fallarán. En el medio, tenemos esta solución funcionando desde el momento en que hice esta pregunta primero (hace 4 años), y nos salvó de problemas de escalado varias veces desde entonces.

Tengo algunos problemas con la propiedad Form.AutoScaleMode junto con controles de tamaño fijo, cuando uso una fuente no predeterminada. Lo reduje a una simple aplicación de prueba (WinForms 2.0) con solo un formulario, algunos controles de tamaño fijo y las siguientes propiedades:

class Form1 : Form { // ... private void InitializeComponent() { // ... this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; this.Font = new System.Drawing.Font("Tahoma", 9.25F); // ... } }

En 96 ppp, Windows XP, el formulario se ve correctamente como este ejemplo de 96 ppp:

Con menos de 120 ppp, Windows XP, la función de escalado automático de Windows Forms produce este ejemplo de 120 ppp:

Como puede ver, las cajas de grupo, los botones, la lista o las vistas de árbol están escaladas correctamente, los cuadros de texto de líneas múltiples son demasiado grandes en el eje vertical y las etiquetas de tamaño fijo no se escalan correctamente tanto en dirección vertical como horizontal. Parece ser un error en .NET Framework?

EDITAR: algunas sugerencias: el cambio de Fuente solo se aplica al formulario que lo contiene, los controles heredan su fuente del formulario. Me gustaría mantenerlo así, si es posible.

Con la fuente predeterminada (Microsoft Sans Serif 8.25pt), este problema no ocurre. Usar AutoScaleMode = Font (con AutoScaleDimensions adecuada, por supuesto) o no escala o escalas exactamente como se ve arriba, dependiendo de cuándo se establece la fuente (antes o después del cambio de AutoScaleMode). El problema no es específico de la fuente "Tahoma", sino que también ocurre con Microsoft Sans Serif, 9.25pt.

Y sí, ya leí este mensaje SO de problemas de DPI, pero realmente no me ayuda.

¿Alguna sugerencia de cómo solucionar esto?

EDIT2: Alguna información adicional sobre mi intención: tengo alrededor de 50 diálogos de tamaño fijo que ya funcionan con varios cientos de controles de tamaño fijo y colocados correctamente. Se migraron desde un marco de GUI anterior de C ++ a C # / Winforms, es por eso que todos son de tamaño fijo. Todos se ven bien con 96 dpi con una fuente de 9.25pt. En el marco anterior, el escalado a 120 ppp funcionó bien: todos los controles de tamaño fijo tuvieron la misma escala en ambas dimensiones. La semana pasada, detectamos este extraño comportamiento de escalamiento en WinForms al cambiar a 120 ppp. Puede imaginarse que la mayoría de nuestros cuadros de diálogo se ven muy mal en 120 ppp. Estoy buscando una solución que evite un rediseño completo de todos esos cuadros de diálogo.

EDIT3: Para probar este comportamiento, en mi humilde opinión, es una buena idea configurar un entorno virtual de Windows XP con 120 ppp, mientras que el entorno de desarrollo se encuentra a menos de 96 ppp (al menos, eso es lo que hice). Cambiar entre 96 y 120 ppp normalmente necesita reiniciarse en Win XP, de lo contrario, no verá lo que realmente sucede.

// As requested: the source code of Form1.cs namespace DpiChangeTest { public partial class Form1 : Form { public Form1() { InitializeComponent(); Font f = this.textBox1.Font; } } } // here the source of Form1.Designer.cs: namespace DpiChangeTest { partial class Form1 { private System.ComponentModel.IContainer components = null; protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Forms Designer generated code private void InitializeComponent() { System.Windows.Forms.ListViewItem listViewItem2 = new System.Windows.Forms.ListViewItem("A list view control"); System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("A TreeView control"); this.button1 = new System.Windows.Forms.Button(); this.groupBox1 = new System.Windows.Forms.GroupBox(); this.textBox1 = new System.Windows.Forms.TextBox(); this.label1 = new System.Windows.Forms.Label(); this.listView1 = new System.Windows.Forms.ListView(); this.treeView1 = new System.Windows.Forms.TreeView(); this.SuspendLayout(); // // button1 // this.button1.Location = new System.Drawing.Point(12, 107); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(150, 70); this.button1.TabIndex = 0; this.button1.Text = "Just a button"; this.button1.UseVisualStyleBackColor = true; // // groupBox1 // this.groupBox1.Location = new System.Drawing.Point(12, 12); this.groupBox1.Name = "groupBox1"; this.groupBox1.Size = new System.Drawing.Size(150, 70); this.groupBox1.TabIndex = 1; this.groupBox1.TabStop = false; this.groupBox1.Text = "Just a groupbox"; // // textBox1 // this.textBox1.Location = new System.Drawing.Point(180, 12); this.textBox1.Multiline = true; this.textBox1.Name = "textBox1"; this.textBox1.Size = new System.Drawing.Size(150, 70); this.textBox1.TabIndex = 2; this.textBox1.Text = "A multiline text box"; // // label1 // this.label1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.label1.Location = new System.Drawing.Point(179, 107); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(150, 70); this.label1.TabIndex = 3; this.label1.Text = "A label with AutoSize=False"; // // listView1 // this.listView1.Items.AddRange(new System.Windows.Forms.ListViewItem[] { listViewItem2}); this.listView1.Location = new System.Drawing.Point(12, 201); this.listView1.Name = "listView1"; this.listView1.Size = new System.Drawing.Size(150, 70); this.listView1.TabIndex = 4; this.listView1.UseCompatibleStateImageBehavior = false; // // treeView1 // this.treeView1.Location = new System.Drawing.Point(179, 201); this.treeView1.Name = "treeView1"; treeNode2.Name = "Knoten0"; treeNode2.Text = "A TreeView control"; this.treeView1.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { treeNode2}); this.treeView1.Size = new System.Drawing.Size(150, 70); this.treeView1.TabIndex = 5; // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; this.ClientSize = new System.Drawing.Size(343, 289); this.Controls.Add(this.treeView1); this.Controls.Add(this.listView1); this.Controls.Add(this.label1); this.Controls.Add(this.textBox1); this.Controls.Add(this.button1); this.Controls.Add(this.groupBox1); this.Font = new System.Drawing.Font("Microsoft Sans Serif", 9.25F); this.Name = "Form1"; this.Text = "Form1"; this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.Button button1; private System.Windows.Forms.GroupBox groupBox1; private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.Label label1; private System.Windows.Forms.ListView listView1; private System.Windows.Forms.TreeView treeView1; } } // and Main.cs [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); }


Mi aplicación WinForms tiene Preferencias de tamaño de fuente, donde la fuente se puede establecer en tres niveles (8pt, 10pt o 12pt) en la pantalla principal, y debe descender a todas las formas secundarias.

Los problemas específicos que encontré son con las etiquetas que no son de tamaño automático (por lo general, se utilizan para etiquetas de varias líneas) y cuadros de texto de varias líneas.

La solución que encontré fue agregar la siguiente línea con el control aplicable en los archivos Designer.cs en InitializeComponent ():

this.Label1.Font = this.Font;

o

this.MultiLineTextbox.Font = this.Font;

Esto parece configurar AutoScale correctamente.


Para la solución aceptada al hacer el cambio para cada control: ¿Ha probado cambiar la Fuente del contenedor, pero estableciendo los valores de AutoScaleXXX nuevamente?

Algo como:

this.SuspendLayout(); this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; // Font in this case this.Font = new Font(....); // set your new font this.ResumeLayout();

Lo he hecho al agregar controles dinámicamente, pero no para cambiar las fuentes.


Pude resolver un problema similar con Compact Framework 3.5 en VS 2008. En mi caso, tengo un tabcontrol, y cada tabulación tiene un Panel, y todos están acoplados como completos para sus padres. Cada panel contiene varios controles de etiqueta y cuadro de texto, por lo que la idea es que cuando el usuario abre el SIP (panel de entrada suave / teclado) la barra de desplazamiento aparezca a la derecha y los controles del cuadro de texto se escalen para evitar pintar una barra de desplazamiento horizontal adicional .

Mi intento inicial tenía el modo de autoescala de los formularios establecido en dpi, la propiedad de desplazamiento automático de cada pestaña establecida en verdadero y la propiedad de desplazamiento automático de cada panel establecida en verdadero. Cada etiqueta estaba anclada en la parte superior, izquierda, y cada control de cuadro de texto estaba anclado a la izquierda, arriba, a la derecha. Los formularios se crearon en el diseñador con un ancho de pantalla de 240 píxeles y cuando se ejecutaban en un dispositivo vga con un ancho de pantalla de 480 píxeles, los cuadros de texto se pintaron con espacio suficiente a la derecha para 2 barras de desplazamiento (presumiblemente uno para el tabulador y uno para el panel) aunque las barras de desplazamiento no aparecían. Al activar el SIP, el comportamiento fue correcto, en el sentido de que todos los cuadros de texto se redimensionaron, pero aún tenía 40 o más píxeles de espacio muerto entre el lado derecho del cuadro de texto y la barra de desplazamiento.

Pude resolver el problema simplemente estableciendo la propiedad autocroll de los paneles en falso, luego estableciendo luego en verdadero un tiempo de ejecución cuando se activó el SIP. Esto tuvo el resultado deseado de autoescalar en todo el ancho de la pantalla en ancho de píxel y cambiar el tamaño dinámicamente de los controles de la caja de texto a medida que la barra de desplazamiento se activa o desactiva.

Como nota al margen, el marco compacto (3.5) no tiene el modo de autoescala de fuente (solo ninguno, ppp y heredar), pero traté de restablecer la fuente de cada control de cuadro de texto como el autor original sugirió, pero esto no tenía cualquier efecto en la autoescalada de los controles.


Sin embargo, este frustrante problema que causaba que el espacio en el formulario se desconcertara desproporcionadamente, cambió el AutoScaleMode a "Ninguno" y el problema desapareció por completo.


También encontré el comportamiento extraño, y he compartido dolores de cabeza similares al tratar de escalar automáticamente los controles (y sus fuentes asociadas) en mi aplicación en respuesta a un cambio de tamaño o resolución.

Por lo que vale, aquí hay un breve resumen de lo que he estado tratando de aplicar una corrección manual:

En primer lugar, al iniciar la aplicación, capturo la resolución del sistema del usuario accediendo al miembro de Bounds en la propiedad Screen :: PrimaryScreen y redimensionando el formulario mediante programación en función de la diferencia porcentual del sistema de tiempo de desarrollo. Este nuevo tamaño de formulario se almacena y usa como tamaño base para todos los ajustes futuros. Además, al cambiar el tamaño del formulario en tiempo de ejecución, invoca el evento SizeChanged que he manejado para hacer mi escala. En pocas palabras, el controlador de eventos hace lo siguiente:

  • Cambia el tamaño de todos los controles según los nuevos porcentajes de ancho y alto después de que el usuario elija un tamaño, ya sea desde el mouse o un tamaño predefinido.

  • Cambia el tamaño de fuente asociado con cada control por el nuevo factor de escala

Teóricamente, si los controles se mueven a una nueva ubicación en función del porcentaje del tamaño del formulario modificado, debe mantenerlos en relación con todos los demás controles. Por supuesto, cada vez que el usuario cambia el tamaño del formulario, sucede lo anterior, no solo en el tiempo de ejecución inicial.

No estoy seguro de si esta solución es tonta o no, pero el tiempo que he pasado, o perdido, peleando con AutoScale, AutoSize y Anchoring en vano ha sido astronómico. No estoy tratando de secuestrar tu sección, Doc, solo pensé en compartir mis procesos de pensamiento contigo y quizás resucitar este tema con la esperanza de que alguien tenga una visión superior sobre esta pesadilla.


Tenga en cuenta que, dado que muchos de los problemas mencionados están relacionados con el tamaño de fuente, es importante ser coherente con la familia de fuentes y el tamaño. Esto significa establecer la fuente en el formulario base o en el control de usuario base (si tiene uno) y dejar que los controles hereden esa configuración. Noté que cuando tenía un formulario con un UserControl dentro, si seleccionaba el control y cambiaba el tamaño de la fuente, algunos elementos cambiaban de tamaño y otros no. Me di cuenta de que los elementos que no cambiaban de tamaño tenían su configuración de fuente establecida específicamente (desbordada). Fue en ese momento que me di cuenta de lo que significaba cuando las propiedades se resaltaban en negrita. Entonces, por ejemplo, si tiene una etiqueta y el apoyo de la fuente está en negrita significa que alguien lo cambió. Debe borrar todos los accesorios de fuente que se configuraron de esa manera para que obtengan su fuente del elemento principal, en este caso, el formulario que lo contiene. Simplemente puede resaltar el texto de la propiedad de la fuente y eliminar o hacer clic con el botón derecho en el apoyo de la fuente y seleccionar borrar. Esto eliminará la línea de fuente del archivo de diseñador y permitirá que el control herede la fuente de su padre. Esto probablemente regrese a Microsoft Sans Serif, pero si lo compilará, recuperará la fuente de su padre. Por supuesto, debe seguir el diseño adecuado usando paneles de diseño y propiedades de anclaje y base, pero creo que, en general, si borra todo lo demás montó apoyos de fuente encontrará que si selecciona el control de usuario dentro de su formulario y cambia el modo autoscale a Ninguno, tendrá mejor suerte También para la prueba, si luego cambia el tamaño de fuente para el control de usuario todos los controles deben cambiar el tamaño (Siempre que no se anule el uso de fuentes) Y siempre que el formulario se diseñe utilizando los paneles de diseño adecuados, todo debería mostrarse bien en otras resoluciones. Al menos hasta ahora, esto ha funcionado.


Yo también tuve ese problema. Especialmente, LinkLabels se mostraba con una fuente demasiado grande y las etiquetas AutoSize se recortaban en algún lugar al final. Al cambiar AutoScaleMode a Dpi en el primer cuadro de diálogo (Principal), se resolvió para todos los formularios. Gracias por el consejo.