WPF Blurry fonts problema-Soluciones


El problema se describe y se demuestra en los siguientes enlaces:

Explicación: Claridad del texto en WPF. Este enlace tiene comparación de fuentes.

Me gustaría recopilar todas las soluciones posibles para este problema. Microsoft Expression Blend utiliza WPF pero las fuentes parecen legibles.

  • Fondo oscuro como en Microsoft Expression Blend
  • Aumentar el tamaño de la fuente y cambiar la fuente (Calibri ... ) [enlace]
  • Incrustar formularios de windows [enlace]
  • Use GDI+ y/o la clase TextRenderer de Windows Forms para renderizar texto en un mapa de bits, y luego renderice ese mapa de bits como un control WPF. [enlace]

Hay más soluciones?

Esto se va a arreglar en VS2010 (y WPF4) beta 2

Mejoras en la Pila de Texto de WPF 4.0

¡PARECE QUE FINALMENTE SE HA RESUELTO !

Scott Hanselman's ComputerZen.com: WPF y Desenfoque de Texto, ahora con total Claridad
Blog de Texto de WPF: Mejoras Adicionales en la Claridad del Texto de WPF

 146
Author: Community, 2008-10-10

10 answers

Antecedentes técnicos

Hay un artículo en profundidad sobre la representación de texto WPF de uno de los Gestores de Programas de Texto WPF en windowsclient.net: Claridad del texto en WPF .

El problema se reduce a que WPF necesita un procesador de fuentes de escala lineal para animaciones suaves. Pure ClearType por otro lado toma un poco de libertad con la fuente para empujar plicas verticales en el siguiente píxel.

La diferencia es obvia si se compara el patrón clásico de "cascada". WinForms en la parte inferior izquierda, WPF en la parte superior derecha:

Aunque tampoco soy fan de la idiosincrasia de renderización de fuentes de WPF, puedo imaginar el clamor si las animaciones saltan como lo hacen en la cascada Winforms.

Jugando con el registro

De especial interés para mí fue el enlace al artículo de MSDN " Configuración del Registro ClearType", que explica los posibles ajustes del lado del usuario en el registro:

  • ClearType nivel: cantidad de subpíxeles insinuando
  • Nivel gamma
  • Estructura de píxeles: cómo se organizan las rayas de color en una pantalla-píxel
  • Nivel de contraste de texto: ajusta el ancho de las plicas de glifos para hacer que la fuente sea más pesada

Jugar con estos ajustes realmente no mejoró el problema subyacente, pero puede ayudar al reducir el efecto de sangrado de color para los usuarios sensibles.

Otro enfoque

El mejor consejo que dio el artículo de Claridad de texto fue aumentar la fuente tamaño y cambiar la fuente. Calibri funciona para mí mejor que la interfaz de usuario Segoe estándar. Debido a su popularidad como fuente web, probé Verdana también, pero tiene un salto desagradable en el peso entre 14pt y 15pt que es muy visible cuando se anima el tamaño de la fuente.

WPF 4.0

WPF 4 tendrá soporte mejorado para influir en el renderizado de fuentes. Hay un artículo en el Blog de Texto de WPF explicando los cambios. Más prominente, ahora hay (al menos) tres tipos diferentes de representación de texto:

Que debe ser suficiente cuerda para cada diseñador.

 102
Author: David Schmitt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-08 14:08:36

. NET 4 finalmente tiene una solución a la pobre calidad de renderizado de texto de WPF, pero está bien oculta. Establezca lo siguiente para cada ventana:

TextOptions.TextFormattingMode="Display"

El valor predeterminado es "Ideal", que no es en absoluto lo que el nombre implica.

Hay otras dos opciones en TextOptions, a saber TextHintingMode y TextRenderingMode, pero ambas tienen valores predeterminados sensibles.

 118
Author: Helge Klein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-03 00:31:27

Encontré un problema el otro día cuando usé un borde que tenía un DropShadowEffect aplicado. El resultado fue que todo el texto dentro de ese borde estaba extremadamente borroso. No importa si el texto estaba dentro de otros paneles o directamente debajo del borde: cualquier bloque de texto que sea hijo del padre que tenga un Efecto aplicado parece estar afectado.

La solución a este caso en particular fue no poner cosas dentro del borde que tiene efectos, sino usar una cuadrícula (o cualquier otra cosa que admita poner contenido uno encima del otro) y coloque un rectángulo en la misma celda que el texto (es decir, como un hermano en el árbol visual) y ponga los efectos en eso.

Así:

<!-- don't do this --->
<Border>
     <Border.Effect>
          <DropShadowEffect BlurRadius="25" ShadowDepth="0" Opacity="1"/>
     </Border.Effect>
     <TextBlock Text="This Text Will Be Blurry" />
</Border>

<!-- Do this instead -->
<Grid>
  <Rectangle>
     <Rectangle.Effect>
          <DropShadowEffect BlurRadius="25" ShadowDepth="0" Opacity="1"/>
     </Rectangle.Effect>
  </Rectangle>
  <TextBlock Text="This Text Will Be Crisp and Clear" />
</Grid>
 34
Author: Isak Savo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-27 15:31:42

Esto se va a arreglar en VS2010 (y WPF4) beta 2:

 10
Author: Pavel Minaev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-09 13:23:57

SnapToDevicePixels solo se aplica a formas WPF (líneas, etc.), no al renderizador de texto.

No se conoce una solución a este problema. Según Microsoft, el comportamiento es "por diseño".

También ver este hilo en los foros de Microsoft discutir los problemas - que ha recibido algunas respuestas de los chicos de MS que aclaran su posición sobre el tema.

 6
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-10 11:31:22

Desde el punto de vista del desarrollador, la única "solución" conocida hasta la fecha es usar GDI+ y/o la clase TextRenderer de Windows Forms para renderizar texto en un mapa de bits, y luego renderizar ese mapa de bits como un control WPF. Aparte de las implicaciones obvias de rendimiento, esto no alivia el problema para las aplicaciones existentes.

Ahora he creado un ticket de Microsoft Connect para este problema (para mi sorpresa, a pesar de toda la negatividad, no hubo un informe de error real en el designado rastreador).

Dado que es uno de los canales oficiales de comunicación de solicitudes y preguntas a Microsoft, yo aconsejaría también ir a través de él para una respuesta más rápida. Al menos, si desea que el problema se aborde de una manera u otra, votar por ese boleto allí y/o validar el problema ayudará a llamar la atención de Microsoft PMs e ingenieros sobre este problema, y posiblemente elevar su prioridad percibida.

 6
Author: David Schmitt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-27 08:00:10

Acabo de probar VS2010 beta, que se hace todo en WPF, y sufre MUCHO por el problema de la fuente borrosa. Particularmente en tooltips.

Eso parece dar alguna evidencia de que WPF4 de hecho no resolverá el problema (si algo parece peor)

 4
Author: Orion Edwards,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-19 21:26:22

Wow, no puedo creer que finalmente tengo mis fuentes WPF legibles. Y tampoco puedo creer que no haya un diálogo de opción para hacer estos cambios fáciles mientras que los valores predeterminados son horribles en mi pantalla.

Estas configuraciones del registro (en decimal) funcionaron para mí y se acercan más a mi fuente cleartype normal:

  • ClearTypeLevel: 10 (mayormente aliasing en escala de grises)
  • GammaLevel: 1300 (gamma más alta hizo la fuente demasiado delgada y estaba viendo los colores en el aliasing)
 4
Author: VVS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-12 09:33:43

No lo veo como un error, pero la configuración predeterminada es realmente muy molesta. He aquí una comparación de todas las combinaciones de

TextOptions.TextRenderingMode
TextOptions.TextFormattingMode
RenderOptions.ClearTypeHint

SnapToDevicePixels no hace ninguna diferencia en la representación de texto.

http://i.stack.imgur.com/cS3S2.png

Prefiero:

TextOptions.TextRenderingMode="Auto"
TextOptions.TextFormattingMode="Ideal"
RenderOptions.ClearTypeHint="Auto"

Donde las líneas verticales nunca son borrosas.

La fuente utilizada es Open Sans Light, que puede ser realmente hermosa si se usa bien, como en el último TeamViewer.

Para aquellos que usan Mahapps.Metro, el problema es el TransitioningContentControl https://github.com/MahApps/MahApps.Metro/issues/889

 4
Author: Gabriel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-20 15:44:29

Dicen que "SnapToDevicePixels = true" funciona, pero nunca he visto buenos resultados.

Combato el texto borroso cambiando a una fuente diferente.

Obviamente esto no es una solución al problema, sin embargo, así es como he trabajado alrededor de él.

 3
Author: Inisheer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-10 07:04:28