所以新的 WPF 4 文本渲染看起来很棒,但是在窗口上启用毛玻璃效果需要您将背景更改为透明,这当然会禁用 ClearType 渲染。
使用提供的 RenderOptions.ClearTypeHint=Enabled 允许您指定子元素以从树中的那个点重新启用 ClearType 渲染。我发现了一些其他主题,这些主题讨论了为 RichTextBox 和 FlowDocumentScrollViewer 内部使用的 ScrollViewer 执行此操作,并且创建自定义样式确实可以修复它,以便我的 FlowDocument 再次获得 ClearType 渲染。
但是,这仅适用于 FlowDocument 中的顶级段落。如果我添加 float 内容或图形或表格,其中的任何文本都会再次出现莫名其妙的灰度。我知道玻璃效果是罪魁祸首,因为禁用它会重新启用 ClearType 渲染。
我用 Snoop 浏览了可视化树,但主要内容(正确呈现)和子内容(灰度)具有相似的元素层次结构,没有任何可以附加 RenderOptions.ClearTypeHint 的内容。
有没有人遇到过这个问题?有解决方法或解决方案吗?我检查了连接,但没有关于此的任何错误。这是一个很烦人的问题。
最佳答案
在做了更多的研究,并比较了不同控件在气动玻璃上和关闭时的工作方式之后,我找到了一些答案。 TextBox 控件也不能正常工作,但 FlowDocument 的部分和 TextBlock 之类的东西可以正常工作,这促使我探索原因。
在反射器中挖掘了一段时间后,我发现当使用高级文本格式 API 获取文本并将其渲染到绘图上下文时,RenderOption 标志基本上被忽略了,因为绘图系统从根视觉(窗口)知道启用了透明度。一旦发生这种情况,世界上的所有 RenderOptions 标志都不会恢复 ClearType。
不过,我确实偶然发现了一个变通方法。如果您有权访问 DrawingContext 并自己进行低级文本渲染,则可以在文本后面使用填充执行 DrawRectangle,并重新启用 ClearType。我认为这是渲染器确保它有合适的背景来绘制的唯一方法。
因此,总而言之,您需要进行自己的文本绘制,此外,您还需要在文本后面使用相同的 DrawingContext 显式绘制背景,以便 ClearType 正确呈现。