wpf - FlowDocument 放置在带有自定义玻璃的窗口中时,子元素中的 ClearType 丢失

标签 wpf flowdocument cleartype

所以新的 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 正确呈现。

关于wpf - FlowDocument 放置在带有自定义玻璃的窗口中时,子元素中的 ClearType 丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5228311/

相关文章:

c# - 为什么 WPF 数据绑定(bind)会吞下异常?

wpf - 如何为 ItemsControl 中的项目添加边框?

c# - 如何获取 FlowDocument 超链接以启动浏览器并转到 WPF 应用程序中的 URL?

wpf - 是否可以在流文档中垂直对齐列表项标记?

c# - WPF/C# - 从 XAML 以编程方式创建 FlowDocument?

css - 关闭 ClearType 的 WinXP 上的糟糕字体 - 仅限 Chrome

truetype - 防止 TrueType 字体的抗锯齿(或子像素渲染)

wpf - 如何使用 CollectionView 功能处理 CompositeCollection?

c# - 我的属性(property)是否更新了我的领域,或者我是否错误地使用了 MVVM

css - 使用过滤器后,您可以在 IE8 上重新启用 ClearType 吗?