【问题标题】:TextBlock blurry in WPF 3.5WPF 3.5 中的 TextBlock 模糊
【发布时间】:2013-01-20 01:23:41
【问题描述】:

有人批评我的一个应用程序。显示的文本被认为是模糊的。我稍微放大了窗口并得到了这个结果(所以他们是对的)

源于我在此简化示例中的尝试:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <TextBlock Text="StatusDTC [1]"></TextBlock>
            <TextBlock Text="StatusDTC [2]"
                       RenderOptions.BitmapScalingMode="NearestNeighbor"
                       RenderOptions.EdgeMode="Aliased"></TextBlock>
            <TextBlock Text="StatusDTC [3]" 
                       SnapsToDevicePixels="True"></TextBlock>
            <TextBlock Text="StatusDTC [4]"
                       SnapsToDevicePixels="True"
                       RenderOptions.BitmapScalingMode="NearestNeighbor"
                       RenderOptions.EdgeMode="Aliased"></TextBlock>
        </StackPanel>
    </Grid>
</Window>

我发现了类似的东西here。但 UseLayoutRounding 似乎不适用于 .Net 3.5。我用谷歌搜索了一下,发现 .Net 4 (TextOptions.TextRenderingMode) 有改进,解决了这个问题,但不能选择使用这个应用程序切换到 .Net 4。

据我所知,Win7 呈现 WPF 与 XP 不同,我还启动了一个虚拟 XP 并在那里进行了尝试。结果是一样的。

有人想在 .Net 3.5 中清晰化文本吗?

【问题讨论】:

标签: wpf .net-3.5 textblock


【解决方案1】:

如果升级到 .NET 4.0 绝对不是一种选择,那么您可以考虑最后一个(有点绝望)的选择:获取其他东西来呈现文本。例如,您可以使用 GDI+ 将您需要的文本呈现为位图,然后显示它。或者您可以使用互操作来托管 Windows 窗体标签控件。

这些都是真正可怕的解决方案(这就是为什么我只是在您在 cmets 中确认使用最新版本的 WPF 根本不是一种选择之后才提出这个建议的原因)。互操作会导致所有常见的 HWND 互操作问题(即,标签将获得自己的 HWND,这意味着它将与 WPF 内容完全分开呈现,这可能会导致明显的视觉不连续性。)

因此,如果我陷入这种情况,我想我会考虑渲染到位图的选项。可以使用 GDI+ 生成位图,然后您可以使用 WPF Image 元素进行渲染。如果您准备编写一个自定义控件来执行此操作,您甚至可以支持数据绑定之类的东西(通过为您呈现的文本定义一个 Text 依赖属性)。虽然这并不简单——尽管在支持 Windows 位图方面存在共同点,但将数据从 GDI+ 世界传输到 WIC(Windows 图像处理组件,这是 WPF 处理位图所依赖的)是……混乱的。此外,如果您需要支持可访问性(例如,使文本对屏幕阅读器可见、支持助记访问键等),那么这将成为一项相对复杂的工作。

【讨论】:

  • 谢谢你,很好的理论可能性清单。在具有数百个条目和众多列的绑定 DataGrid(来自 WPF Toolkit,因为 3.5)中,我将在这里冒险可能没有尝试。对于这里的其他人来说,这可能是一种方式。
【解决方案2】:

正如the link from Ameen's answer 中所解释的,这个问题主要出现在小字体上。

您可以选择增加字体大小吗?我知道这与其说是一种解决方案,不如说是一种解决方法,但如果您无法摆脱 Framework 3.5,它是一种快速简便的方法来消除模糊性。

【讨论】:

    【解决方案3】:

    我不认为你可以在这里做任何事情。 :( BitmapScalingMode 应该不会影响您当前的示例,只要您使用的字体是基于矢量的,您确实需要 4.0 text improvements

    在 Windows 7 中,文本绘图被切换到 DWrite,这就是它与 XP 不同的原因。

    【讨论】:

    • 确认一下,WPF 中相对模糊的文本是一个长期存在的问题,仅在 .NET 4.0 中得到修复。如果您希望 WPF 呈现您的文本,那么让它看起来像普通 Windows 文本一样清晰的唯一方法是使用 v4.0(公平地说,它大约在 3 年前发布!)。
    • @IanGriffiths 当然,.Net4 并不是全新的东西。但有些事情是公司的决定,因此超出了我的影响范围:-/ 感谢您让我的死胡同成为水晶。现在我可以停止搜索,这也很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 2015-12-17
    • 1970-01-01
    • 2011-08-04
    • 2014-05-21
    • 2015-11-14
    相关资源
    最近更新 更多