我想收集此问题的所有可能解决方案。Microsoft Expression Blend使用WPF,但字体看起来可读性好。
- 像Microsoft Expression Blend一样使用黑色背景
- 增加字体大小并更改字体(Calibri ...)[链接]
- 嵌入windows表格[链接]
- 使用GDI +和/或Windows Forms TextRenderer类将文本呈现为位图,然后将该位图作为WPF控件呈现。[链接]
看起来问题终于解决了!
看起来问题终于解决了!
.NET 4终于解决了WPF文本渲染质量差的问题,但它隐藏得很好。在每个窗口中设置以下内容:
TextOptions.TextFormattingMode="Display"
默认值为"Ideal",但这并不是名称所暗示的意思。
在TextOptions中还有两个选项,即TextHintingMode和TextRenderingMode,但它们都有合理的默认值。
在windowsclient.net上有一篇关于WPF文本渲染的深度文章,由WPF文本项目经理撰写:WPF中的文本清晰度。
问题归结为WPF需要线性缩放字体渲染器来实现平滑动画。而纯ClearType则需要对字体进行自由处理,以将垂直柄推入下一个像素。
如果将WinForms和WPF的经典“级联”图案进行比较,差异是显而易见的。WinForms位于左下方,WPF位于右上方:
(来源:black.co.at)
虽然我也不喜欢WPF的字体渲染特异性,但如果动画效果像Winforms级联那样跳跃,我可以想象会引起多大的争议。
对我来说特别有趣的是链接到MSDN文章“ClearType注册表设置”,它解释了注册表中可能的用户端调整:
尝试调整这些设置并没有真正改善根本问题,但可以通过减少颜色渗透效应帮助敏感用户。
文本清晰度文章提供的最佳建议是增加字体大小并更改字体。对我来说,Calibri比标准Segoe UI更好用。由于Verdana作为Web字体很受欢迎,我也尝试了它,但14pt和15pt之间的重量跳跃非常明显,当动画字体大小时非常可见。
WPF 4将改进对字体渲染的支持。有一篇WPF Text博客文章介绍了这些变化。最突出的是,现在有至少三种不同的文本渲染方式:
(来源:windows.net)
<抱怨>这应该足够每个设计师使用了。</抱怨>
<!-- 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>
TextOptions.TextRenderingMode
TextOptions.TextFormattingMode
RenderOptions.ClearTypeHint
SnapToDevicePixels
不会对文本呈现产生任何影响。
我更倾向于:
TextOptions.TextRenderingMode="Auto"
TextOptions.TextFormattingMode="Ideal"
RenderOptions.ClearTypeHint="Auto"
垂直线条不会模糊。
所使用的字体是Open Sans Light,如果使用得当,像最新版本的TeamViewer一样,就可以非常美观。
对于使用Mahapps.Metro的人来说,问题出在TransitioningContentControl
上。https://github.com/MahApps/MahApps.Metro/issues/889
哇,我简直无法相信我终于让我的WPF字体可读了。而且我也无法相信没有选项对话框可以使这些更改变得容易,而默认值在我的显示器上是可怕的。
这些注册表设置(十进制)对我有用,并且最接近我的常规清晰字体:
我刚尝试了VS2010 beta版,它完全使用WPF完成,但是它非常严重地受到了字体模糊的问题,特别是在工具提示上。
这似乎表明WPF4实际上并不能解决这个问题(如果有什么变化,它看起来更糟糕了)。
他们说“SnapToDevicePixels = true”有效,但我从未看到过好的结果。
我通过切换不同的字体来解决模糊文本问题。
显然这不是问题的解决方案,但这是我绕过它的方法。