因此,新的 WPF 4 文本渲染看起来很棒,但在窗口上启用航空玻璃效果需要将背景更改为透明,这当然会禁用 ClearType 渲染。
使用提供的 RenderOptions.ClearTypeHint=Enabled 允许您指定子元素以从树中的该点重新启用 ClearType 渲染。我发现了一些其他主题,讨论如何为 RichTextBox 和 FlowDocumentScrollViewer 内部使用的 ScrollViewer 执行此操作,并且创建自定义样式确实可以解决此问题,以便我的 FlowDocument 再次获得 ClearType 渲染。
但是,这仅适用于 FlowDocument 中的顶级段落。如果我添加漂浮物、图形或表格,其中的任何文本都会再次莫名其妙地变成灰度。我知道玻璃效果是罪魁祸首,因为禁用它会重新启用 ClearType 渲染。
我使用 Snoop 查看了视觉树,但主要内容(正确渲染)和子内容(灰度)都具有类似的元素层次结构,没有任何可以附加 RenderOptions.ClearTypeHint 的内容。
有人遇到过这个问题吗?有解决方法或解决方案吗?我检查了 Connect,但没有任何关于此的错误。这是一个相当烦人的问题。
经过大量研究,并比较了不同控制装置在航空玻璃上和关闭后的工作方式,我找到了一些答案。 TextBox 控件也无法正常工作,但 FlowDocument 的部分内容和 TextBlock 之类的东西可以正常工作,这促使我探索原因。
在反射器中深入研究了一段时间后,我发现当使用高级文本格式化 API 获取文本并将其渲染到绘图上下文上时,RenderOption 标志基本上会被忽略,因为绘图系统从根视觉(窗口)知道透明度已启用。一旦发生这种情况,世界上所有的 RenderOptions 标志都不会恢复 ClearType。
不过,我确实偶然发现了一个解决方法。如果您有权访问 DrawingContext 并且自己进行低级文本渲染,则可以在文本后面执行 DrawRectangle 并进行填充,并且 ClearType 会重新启用。我认为这是渲染器确保它有合适的背景可供绘制的唯一方法。
总之,您需要进行自己的文本绘制,此外您还需要在文本后面使用相同的 DrawingContext 显式绘制背景,以便 ClearType 能够正确呈现。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)