【问题标题】:WPF WindowsFormsHost creates fuzzy textWPF WindowsFormsHost 创建模糊文本
【发布时间】:2014-07-04 00:36:02
【问题描述】:

我在 WPF 窗口的 WindowsFormsHost 内托管了一个 winforms DataGridView。功能很好,但网格单元格中的文本看起来有点模糊。通常 WinForms 文本几乎没有抗锯齿。

如何使DataGridView 文本看起来像在Windows Form 上正常显示的那样,或者至少更清晰?我曾尝试使用WindowsFormsHostTextOptions.TextFormattingModeSnapsToDevicePixelssettings,但没有发现任何区别。

作为我的意思的一个例子,这里有两个屏幕截图:

Datagridview 在 WPF 中 WindowsFormsHost:

DataGridView 在 Windows 窗体中:

【问题讨论】:

    标签: wpf visual-studio-2010 text-rendering windowsformshost


    【解决方案1】:

    托管 WinForms/Win32 内容的外观不应受 WPF 影响。有一个“空域”限制,规定单个窗口像素只能由单个图形 API 拥有,并且只能由该 API 绘制。因此,WinForms 内容由 WinForms/GDI+ 绘制,即使由 WPF 托管也是如此。这解释了为什么托管内容将绘制在同一窗口中的任何 WPF 内容之上,即使 WPF 内容位于其前面。

    更改像TextFormattingMode 这样的 WPF 呈现属性不会影响互操作内容的外观。您应该查看托管 WinForms 内容的布局/渲染属性。

    更新

    据推测,对于 DataGridView,WPF 默认为灰度 AA 时会产生模糊效果。在DataGridViewPaint和/或CellPainting事件中,将图形文字提示设置为cleartype:

     e.Graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.ClearTypeGridFit
    

    消除了大部分的模糊性。

    【讨论】:

    • 这是有道理的,但是当我将 DataGridView 放在 Windows 窗体上,然后将相同的 DataGridView 放在 WPF 窗口中的 WindowsFormHost 中时,文本呈现的差异非常明显.
    • 奇数。 WindowsFormsHost 设置 一些 WPF 和 WinForms 属性之间的转换,例如 ForegroundBackgroundFontFamily 等(请参阅 WindowsFormsHostPropertyMap)。但我没有看到任何会影响抗锯齿的东西。也许有一个进程范围的标志正在被继承?
    • 是的,就代码而言,我只是将网格转储到WindowsFormsHost 中,从上面的屏幕截图FontFamily 看起来相同或非常相似。这远远超出了我的理解范围。但是当查看一个由相当小的文本组成的大网格时,抗锯齿会变得有点烦人,至少在我的显示器上是这样。
    • 从屏幕截图来看,它似乎在使用灰度抗锯齿(与 ClearType 相对)。我怀疑它 一个进程范围的标志,因为我似乎记得 WPF 应用程序会退回到灰度 AA,即使系统范围的 AA 被禁用。
    • 很高兴知道发生了什么事,至少...有什么办法可以关闭它吗?还是总体上做得更好?
    猜你喜欢
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 2014-05-21
    • 2011-05-09
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    相关资源
    最近更新 更多