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