Problème des polices floues de WPF-Solutions
est décrit et démontré sur les liens suivants:
- Paul Stovell WPF: rendu de texte flou
- www.gamedev.net forum
- Microsoft Connect: WPF texte convertisseur produit mal texte flou sur les petites tailles de police
Explication: Texte de Clarté dans WPF . Ce lien a la comparaison de police.
je voudrais recueillir toutes les solutions possibles à ce problème. Microsoft Expression Blend utilise WPF mais les polices semblent lisibles.
- arrière-plan Sombre comme dans Microsoft Expression Blend
- augmentation de la taille de la police et modification de la police (Calibri ... ) [lien]
- Embed windows forms [link]
- utilisez la classe GDI+ et/ou Windows Forms TextRenderer pour afficher du texte sur un bitmap, puis afficher ce bitmap comme contrôle WPF. [lien]
y a-t-il d'autres solutions?
cela va être fixé dans VS2010 (et WPF4) beta 2
WPF 4.0 Pile de Texte Améliorations
IL SEMBLE QU'IL AIT ÉTÉ FINALEMENT RÉSOLU !
Scott Hanselman's ComputerZen.com: WPF et texte flou, maintenant avec une clarté complète
Blog de texte du FPF: améliorations supplémentaires de la clarté du texte du FPF
10 réponses
cadre Technique
il y a un article en profondeur sur le texte de WPF rendu par l'un des gestionnaires de programme de texte de WPF sur windowsclient.net: Text Clarity in WPF .
le problème vient du fait que la WPF a besoin d'une police d'échelle linéaire pour des animations lisses. Pur ClearType d'autre part prend un peu de liberté avec la police pour pousser des tiges verticales dans le prochain pixel.
le la différence est évidente si l'on compare le classique "cascade". WinForms sur le côté inférieur gauche, WPF sur le côté en haut à droite:
même si Je ne suis pas fan des idiosyncrasies de rendu de police de WPF non plus, je peux imaginer la clameur si les animations sautent comme ils le font dans la cascade Winforms.
jouer avec le registre
d'un intérêt particulier pour moi était le lien à la MSDN article " ClearType Registry Settings ", qui explique les ajustements côté utilisateur possibles dans le registre:
- ClearType niveau: le montant de la sous-pixel allusion
- niveau Gamma
- Pixel structure: comment les bandes de couleur dans un écran-pixel sont organisés
- niveau de contraste du texte: ajuste la largeur des tiges de glyphe pour rendre la police plus lourde
jouer avec ces paramètres n'a pas vraiment améliorer le problème sous-jacent, mais peut aider en réduisant l'effet de saignement de couleur pour les utilisateurs sensibles.
une autre approche
le meilleur conseil que l'article sur la clarté du texte donnait était d'augmenter la taille de la police et de changer la police. Calibri fonctionne pour moi mieux que L'interface standard Segoe. En raison de sa popularité comme font web, J'ai essayé Verdana aussi, mais il a un saut méchant dans le poids entre 14pt et 15pt qui est très visible lors de l'animation de la taille de la police.
WPF 4.0
WPF 4 aura un support amélioré pour influencer le rendu des polices. Il y a un article sur le Blog de texte de WPF expliquant les changements. Plus particulièrement, il y a maintenant (au moins) trois types différents de rendu de texte:
< grumble>cela devrait suffire corde pour chaque concepteur.< / grumble>
.NET 4 a finalement une solution à la mauvaise qualité du rendu de texte de WPF, mais elle est bien cachée. Définissez ce qui suit pour chaque fenêtre:
TextOptions.TextFormattingMode="Display"
valeur par défaut est "idéal" qui n'est pas du tout ce que le nom implique.
il y a deux autres options dans TextOptions, à savoir TextHintingMode et TextRenderingMode, mais elles ont toutes deux des valeurs par défaut raisonnables.
j'ai rencontré un problème l'autre jour lorsque j'ai utilisé une bordure qui avait un Dropshadoweffet appliqué. Il en est résulté que tout le texte à l'intérieur de cette frontière était extrêmement flou. Peu importe si le texte était à l'intérieur d'autres panneaux ou directement sous la frontière - tout bloc de texte qui est l'enfant du parent qui a un effet appliqué semble être affecté.
la solution à ce cas particulier a été de ne pas mettre des choses à l'intérieur de la bordure qui a des effets, mais à la place utilisez une grille (ou n'importe quoi d'autre qui supporte mettre le contenu sur l'autre) et placez un rectangle dans la même cellule que le texte (c.-à-d. comme un frère dans l'arbre visuel) et mettez les effets sur cela.
Comme suit:
<!-- 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>
SnapToDevicePixels ne s'applique qu'à WPF, des formes (lignes, etc.), pas de moteur de rendu de texte.
Il n'y a pas de solution connue à ce problème. Selon Microsoft, le comportement est "by design".
Voir aussi ce" fil sur les forums Microsoft discutant des problèmes - il a obtenu quelques réponses DE MS guys qui clarifient leur position sur la question.
du point de vue du développeur, la seule" solution de rechange " connue à ce jour est d'utiliser la classe GDI+ et/ou Windows Forms TextRenderer pour rendre le texte à un bitmap, puis rendre ce bitmap comme contrôle WPF. Mis à part les implications évidentes sur le rendement, cela ne soulage pas le problème pour les applications existantes.
j'ai maintenant créé un Microsoft Connect ticket pour ce numéro (à ma surprise, malgré toute la négativité, il n'y avait pas de bogue rapport désignés dans le tracker).
étant donné que C'est l'un des canaux officiels de communication des demandes et des questions à Microsoft, je vous conseille également d'y aller pour une réponse plus rapide. Au moins, si vous souhaitez que la question soit abordée d'une manière ou d'une autre, voter pour ce billet et/ou valider la question aidera à attirer l'attention de Microsoft PMs et les ingénieurs sur ce problème, et peut-être soulever sa priorité perçue.
vient D'essayer la version bêta de VS2010, qui se fait en WPF, et elle souffre beaucoup de la question de la police floue. En particulier sur les info-bulles.
qui semble donner une certaine preuve que WPF4 ne va pas en fait résoudre le problème (si quelque chose semble pire)
Wow, je ne peux pas croire que j'ai finalement eu mes polices WPF lisibles. Et je ne peux pas croire qu'il n'y a pas de dialogue d'option pour rendre ces changements faciles alors que les valeurs par défaut sont horribles sur mon écran.
Ces paramètres de registre (en décimal) a travaillé pour moi et le plus proche de mon cleartype de police:
- ClearTypeLevel: 10 (principalement des niveaux de gris de l'aliasing)
- GammaLevel: 1300 (higher gamma fait la police trop mince et je voyais les couleurs dans l'alias)
Je ne le vois pas comme un bug, mais la configuration par défaut est en effet très gênante. Voici une comparaison de toutes les combinaisons de
TextOptions.TextRenderingMode
TextOptions.TextFormattingMode
RenderOptions.ClearTypeHint
SnapToDevicePixels
ne fait pas de différence dans le rendu de texte.
je préfère:
TextOptions.TextRenderingMode="Auto"
TextOptions.TextFormattingMode="Ideal"
RenderOptions.ClearTypeHint="Auto"
où les lignes verticales ne sont jamais floues.
la police utilisée est ouverte Sans lumière, qui peut être vraiment belle si elle est bien utilisée,comme dans TeamViewer.
pour ceux qui utilisent Mahapps.Métro, le problème est le TransitioningContentControl
https://github.com/MahApps/MahApps.Metro/issues/889
ils disent" SnapToDevicePixels = true " fonctionne, mais je n'ai jamais vu de bons résultats.
je combats le texte flou en passant à une police différente.
évidemment, ce n'est pas une solution au problème, mais c'est comme ça que je l'ai contourné.