WPF 3.5中的TextBlock模糊

时间:2013-02-05 07:18:30

标签: wpf .net-3.5 textblock

对我的一个申请有批评。显示的文本被视为模糊。我稍微缩小了窗口,得到了这个结果(所以它们是正确的)

Blurry text

源自我在这个简化示例中尝试过的内容:

<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。我用google搜索了一下,发现.Net 4(TextOptions.TextRenderingMode)在解决这个问题方面有所改进,但是用这个应用程序切换到.Net 4不是一个选择。

我知道Win7渲染WPF与XP不同,我也开始使用虚拟XP并在那里试用。结果是一样的。

有人有想法清理.Net 3.5中的文字吗?

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

如果绝对不能选择升级到.NET 4.0,那么您可以考虑使用最后一个(稍微绝望)的选项:获取其他内容来呈现文本。例如,您可以使用GDI +将位图呈现所需的文本然后显示出来。或者您可以使用互操作来托管Windows窗体标签控件。

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

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

答案 2 :(得分:1)

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

增加字体大小是一个选项吗?我知道这更像是一种解决方法,而不是一种解决方案,但如果你不能摆脱Framework 3.5,它就是一种快速简便的方法来摆脱模糊。