WPF Blurry fonts issue- Solutions

El problema se describe y demuestra en los siguientes enlaces:

  • Paul Stovell WPF: Representación de texto borroso
  • www.gamedev.net foro
  • Microsoft Connect: el procesador de texto WPF produce texto mal borroso en tamaños de letra pequeños

Explicación: Text Clarity en WPF . Este enlace tiene una comparación de fuente.

Me gustaría recostackr todas las soluciones posibles para este problema. Microsoft Expression Blend usa WPF pero las fonts parecen legibles.

  • Fondo oscuro como en Microsoft Expression Blend
  • Aumentar el tamaño de fuente y cambiar la fuente (Calibri …) [enlace]
  • Incrustar formularios de Windows [enlace]
  • Utilice GDI + y / o la clase TextRenderer de Windows Forms para representar texto en un bitmap y luego renderice ese bitmap como control WPF. [enlazar]

¿Hay más soluciones?

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

Mejoras en la stack de texto de WPF 4.0

¡PARECE QUE HA SIDO RESUELTO FINALMENTE!

ComputerZen.com de Scott Hanselman: WPF y Blurriness de texto, ahora con claridad completa
Blog de texto WPF: Mejoras adicionales de claridad de texto de WPF

Experiencia técnica

Hay un artículo en profundidad sobre el procesamiento de texto WPF de uno de los administradores de progtwigs de texto de WPF en windowsclient.net: Text Clarity en WPF .

El problema se reduce a WPF que necesita un generador de fonts de escalado lineal para animaciones fluidas. Pure ClearType por otro lado toma bastante libertad con la fuente para empujar tallos verticales en el siguiente píxel.

La diferencia es obvia si se compara el patrón clásico de “cascada”. WinForms en el lado inferior izquierdo, WPF en el lado superior derecho:

Aunque tampoco soy partidario de la idiosincrasia de representación de fonts de WPF, puedo imaginarme el clamor si las animaciones saltarían como lo hacen en la cascada de Winforms.

Jugando con el registro

De especial interés para mí fue el enlace al artículo de MSDN ” ClearType Registry Settings “, que explica los posibles ajustes del lado del usuario en el registro:

  • Nivel ClearType: cantidad de sugerencias subpíxel
  • Nivel gamma
  • Estructura de píxeles: cómo se organizan las franjas de color en un píxel de visualización
  • Nivel de contraste de texto: ajusta el ancho de los tallos del glifo para hacer que la fuente sea más pesada

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

Otro enfoque

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

WPF 4.0

WPF 4 tendrá un mejor soporte para influir en la prestación de las fonts. Hay un artículo en el blog de texto de WPF explicando los cambios. Más prominentemente, ahora hay (al menos) tres tipos diferentes de representación de texto:

comparación de representación de texto

Eso debería ser suficiente cuerda para cada diseñador.

.NET 4 finalmente tiene una solución para la pobre calidad de reproducción de texto de WPF, pero está bien escondida. 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, concretamente TextHintingMode y TextRenderingMode, pero ambas tienen valores predeterminados razonables.

El otro día tuve un problema cuando utilicé un borde que tenía un efecto DropShadow aplicado. El resultado fue que todo el texto dentro de ese borde era extremadamente borroso. No importa si el texto estaba dentro de otros paneles o directamente debajo del borde: cualquier bloque de texto que sea hijo de uno de los padres que tenga aplicado un efecto parece verse afectado.

La solución a este caso particular fue no poner cosas dentro del borde que tengan efectos, sino usar una grilla (o cualquier otra cosa que permita poner el contenido una encima de la otra) y colocar un rectángulo en la misma celda que el texto (es decir, como un hermano en el árbol visual) y poner los efectos sobre eso.

Al igual que:

                 

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

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

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

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

Desde el punto de vista de un 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 bitmap, y luego renderizar ese bitmap como 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 había un informe de error real en el rastreador designado).

Dado que ese es uno de los canales oficiales de comunicación de solicitudes y preguntas a Microsoft, también le aconsejaría que lo revise para obtener una respuesta más rápida. Al menos, si desea que el problema se trate de una manera u otra, votar allí y / o validar el problema ayudará a llamar la atención de los ingenieros de administración de servidores y los ingenieros de Microsoft sobre este problema, y ​​posiblemente elevará su prioridad percibida.

Acabo de probar VS2010 beta, que está todo hecho en WPF, y sufre MALDE el problema de fuente borrosa. Particularmente en la información sobre herramientas.

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

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

Estas configuraciones de registro (en decimal) me funcionaron y se acercan a mi fuente de tipo de letra normal:

  • ClearTypeLevel: 10 (principalmente alias de escala de grises)
  • GammaLevel: 1300 (gamma superior hizo que la fuente fuera demasiado delgada y estaba viendo los colores en el aliasing)

No lo veo como un error, pero la configuración predeterminada es muy molesta. Aquí hay 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

Yo 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 muy bonita 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

Dicen que funciona “SnapToDevicePixels = true”, pero nunca he visto ningún buen resultado.

Combato el texto borroso cambiando a una fuente diferente.

Obviamente, esta no es una solución al problema, sin embargo, así es como lo he solucionado.